{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-28T09:03:01.249516Z",
     "start_time": "2025-02-28T09:02:54.156354Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n",
    "torch.manual_seed(seed)\n",
    "torch.cuda.manual_seed_all(seed)\n",
    "np.random.seed(seed)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu118\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备数据\n",
    "\n",
    "这里使用subword分词，我们使用已经清洗好的数据集，可以从[此处](https://www.kaggleusercontent.com/kf/98352223/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..nKt8lrIW5ej5QJQVpOWuqQ.oLIgiLMONU5Gpj_maVudRJa55NSOCILxk4JNZhvuXmeDBR-oG0uQm7bDHBfSwZRGvOBHQTsRV308iNP80btfwMinQ7yvJNt-GwdQF4XR4DIsg-2CbEPYiMsi_NdbL0FmE9LYStKdxCWbrCZCCMrTmo5LxR1txwibXaSpeP5Inobhbez5zetZIRH210CBuX2JbpRc_DULQpazKbtFPitwyfktVmdG_syvVAU6Sk9b0r0_erYAgb_jkKXX1Mxo1KzWSKLcAvbmMIPcsUkx9PmeJDs_wopfsQsZ1h5jaQX4_l0CTZrEenP6lIPDxpTwXANqqdHspmZeeEIAThqCHC6sb5DxTvG89BwzY9rc53Aa0uX4V806wJVybnRXoaV65K4GqpjnxbBK0WC8G-2lNtrqFujE89KDXZjFPgyfOEj1QIu13oFNSjgs6o4VV1PdZOrhiNdSmjb44c22l_unOaFojzJgzcPxq9AG2lcmrOpdZ2qu1jjdwey-58TA2ZHNCo3XnjEe2n3ignpnbsdLFpo22O8QakSUHv91wuYDYdNi3AiSmltL_k2ChuKfJ0G8kATpLe4k8wA26sO4GMXg4HImOr3b4aDVEIWXdApHP0ecFKs6ELTo8O7X-TK8Jvbua7e6qpDfDc-r_cD73fVSgSek5yNmKQMBzuVcjkprXmcxICQ.kV1b4N1s64NERKnt4zwQgQ/imdb_processed.csv)下载，分词使用 [subword-nmt](https://github.com/rsennrich/subword-nmt)"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-28T09:09:16.122571Z",
     "start_time": "2025-02-28T09:09:15.467247Z"
    }
   },
   "source": [
    "cleaned_df = pd.read_csv(\"imdb_processed.csv\")\n",
    "print(cleaned_df.shape) # (50000, 2), 50000条评论, 2列\n",
    "\n",
    "# 随机打乱数据，取训练集和测试集\n",
    "np.random.seed(seed) #随机\n",
    "cleaned_df = cleaned_df.sample(frac=1).reset_index(drop=True)#打乱，frac=1表示全部打乱（frac是比例，reset_index(drop=True)是重新索引\n",
    "with open(\"imdb_train.txt\", \"w\", encoding=\"utf8\") as file:# 保存训练集\n",
    "    for line in cleaned_df.processed.values[:25000]:#只保存了processed列，即评论文本，没有保存label列\n",
    "        file.write(line.lower() + \"\\n\") #变为小写，token数量少一些\n",
    "\n",
    "with open(\"imdb_test.txt\", \"w\", encoding=\"utf8\") as file:# 保存测试集\n",
    "    for line in cleaned_df.processed.values[25000:]:\n",
    "        file.write(line.lower() + \"\\n\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(50000, 2)\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-28T09:09:44.265106Z",
     "start_time": "2025-02-28T09:09:25.615882Z"
    }
   },
   "source": [
    "# 学习bpe分词(很慢,学一次就好)\n",
    "!subword-nmt learn-joint-bpe-and-vocab -i ./imdb_train.txt -o ./imdb_bpe_code --write-vocabulary ./imdb_bpe_vocab -s 8000\n",
    "# -i 选择学习的文件\n",
    "# -o 核心输出文件,分词需要用到imdb_bpe_code\n",
    "# --write-vocabulary 字典输出文件\n",
    "# -s 词表大小\n",
    "\n"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "  0%|          | 0/8000 [00:00<?, ?it/s]\n",
      "  0%|          | 2/8000 [00:00<06:46, 19.69it/s]\n",
      "  0%|          | 7/8000 [00:00<03:52, 34.32it/s]\n",
      "  0%|          | 11/8000 [00:00<03:45, 35.43it/s]\n",
      "  0%|          | 18/8000 [00:00<02:50, 46.92it/s]\n",
      "  0%|          | 27/8000 [00:00<02:11, 60.53it/s]\n",
      "  0%|          | 37/8000 [00:00<01:55, 68.77it/s]\n",
      "  1%|          | 56/8000 [00:00<01:16, 103.27it/s]\n",
      "  1%|          | 70/8000 [00:00<01:10, 113.25it/s]\n",
      "  1%|1         | 93/8000 [00:00<00:53, 147.07it/s]\n",
      "  2%|1         | 122/8000 [00:01<00:41, 188.23it/s]\n",
      "  2%|1         | 153/8000 [00:01<00:34, 224.28it/s]\n",
      "  2%|2         | 187/8000 [00:01<00:30, 257.80it/s]\n",
      "  3%|2         | 224/8000 [00:01<00:26, 288.44it/s]\n",
      "  3%|3         | 267/8000 [00:01<00:23, 329.65it/s]\n",
      "  4%|3         | 301/8000 [00:01<00:23, 324.41it/s]\n",
      "  4%|4         | 354/8000 [00:01<00:19, 383.16it/s]\n",
      "  5%|4         | 396/8000 [00:01<00:19, 392.96it/s]\n",
      "  6%|5         | 453/8000 [00:01<00:17, 442.69it/s]\n",
      "  6%|6         | 501/8000 [00:01<00:16, 449.93it/s]\n",
      "  7%|7         | 562/8000 [00:02<00:15, 495.22it/s]\n",
      "  8%|7         | 616/8000 [00:02<00:14, 505.53it/s]\n",
      "  8%|8         | 680/8000 [00:02<00:13, 544.44it/s]\n",
      "  9%|9         | 747/8000 [00:02<00:12, 581.40it/s]\n",
      " 10%|#         | 806/8000 [00:02<00:12, 559.47it/s]\n",
      " 11%|#         | 873/8000 [00:02<00:12, 589.32it/s]\n",
      " 12%|#1        | 941/8000 [00:02<00:11, 614.73it/s]\n",
      " 13%|#2        | 1006/8000 [00:02<00:11, 624.20it/s]\n",
      " 14%|#3        | 1085/8000 [00:02<00:10, 671.54it/s]\n",
      " 14%|#4        | 1156/8000 [00:03<00:10, 679.45it/s]\n",
      " 15%|#5        | 1232/8000 [00:03<00:09, 702.12it/s]\n",
      " 16%|#6        | 1303/8000 [00:03<00:09, 702.23it/s]\n",
      " 17%|#7        | 1385/8000 [00:03<00:08, 736.25it/s]\n",
      " 18%|#8        | 1469/8000 [00:03<00:08, 766.89it/s]\n",
      " 19%|#9        | 1550/8000 [00:03<00:08, 778.12it/s]\n",
      " 20%|##        | 1637/8000 [00:03<00:07, 804.46it/s]\n",
      " 22%|##1       | 1731/8000 [00:03<00:07, 843.64it/s]\n",
      " 23%|##2       | 1830/8000 [00:03<00:06, 885.65it/s]\n",
      " 24%|##4       | 1926/8000 [00:03<00:06, 906.21it/s]\n",
      " 25%|##5       | 2017/8000 [00:04<00:06, 906.40it/s]\n",
      " 27%|##6       | 2123/8000 [00:04<00:06, 951.08it/s]\n",
      " 28%|##7       | 2235/8000 [00:04<00:05, 999.59it/s]\n",
      " 29%|##9       | 2349/8000 [00:04<00:05, 1040.97it/s]\n",
      " 31%|###       | 2463/8000 [00:04<00:05, 1068.96it/s]\n",
      " 32%|###2      | 2588/8000 [00:04<00:04, 1122.38it/s]\n",
      " 34%|###4      | 2721/8000 [00:04<00:04, 1181.92it/s]\n",
      " 36%|###5      | 2867/8000 [00:04<00:04, 1262.36it/s]\n",
      " 38%|###7      | 3009/8000 [00:04<00:03, 1308.66it/s]\n",
      " 40%|###9      | 3166/8000 [00:04<00:03, 1385.51it/s]\n",
      " 42%|####1     | 3327/8000 [00:05<00:03, 1446.17it/s]\n",
      " 44%|####3     | 3501/8000 [00:05<00:02, 1533.59it/s]\n",
      " 46%|####6     | 3711/8000 [00:05<00:02, 1699.26it/s]\n",
      " 49%|####9     | 3947/8000 [00:05<00:02, 1892.33it/s]\n",
      " 53%|#####2    | 4206/8000 [00:05<00:01, 2095.66it/s]\n",
      " 57%|#####6    | 4559/8000 [00:05<00:01, 2512.75it/s]\n",
      " 60%|######    | 4811/8000 [00:06<00:02, 1159.57it/s]\n",
      " 63%|######2   | 5003/8000 [00:06<00:03, 980.92it/s] \n",
      " 64%|######4   | 5157/8000 [00:06<00:02, 985.64it/s]\n",
      " 66%|######6   | 5295/8000 [00:06<00:02, 983.21it/s]\n",
      " 68%|######7   | 5421/8000 [00:06<00:02, 985.99it/s]\n",
      " 69%|######9   | 5539/8000 [00:06<00:02, 1002.27it/s]\n",
      " 71%|#######   | 5654/8000 [00:06<00:02, 1000.68it/s]\n",
      " 72%|#######2  | 5764/8000 [00:07<00:02, 941.78it/s] \n",
      " 73%|#######3  | 5865/8000 [00:07<00:02, 936.13it/s]\n",
      " 75%|#######4  | 5972/8000 [00:07<00:02, 967.79it/s]\n",
      " 76%|#######6  | 6085/8000 [00:07<00:01, 1009.19it/s]\n",
      " 78%|#######7  | 6208/8000 [00:07<00:01, 1065.73it/s]\n",
      " 79%|#######9  | 6339/8000 [00:07<00:01, 1133.55it/s]\n",
      " 81%|########  | 6475/8000 [00:07<00:01, 1197.78it/s]\n",
      " 83%|########2 | 6614/8000 [00:07<00:01, 1251.81it/s]\n",
      " 85%|########4 | 6771/8000 [00:07<00:00, 1342.01it/s]\n",
      " 87%|########6 | 6938/8000 [00:08<00:00, 1436.94it/s]\n",
      " 89%|########8 | 7111/8000 [00:08<00:00, 1519.32it/s]\n",
      " 91%|#########1| 7283/8000 [00:08<00:00, 1577.25it/s]\n",
      " 93%|#########3| 7472/8000 [00:08<00:00, 1667.03it/s]\n",
      " 96%|#########5| 7671/8000 [00:08<00:00, 1762.18it/s]\n",
      " 99%|#########8| 7881/8000 [00:08<00:00, 1860.35it/s]\n",
      "100%|##########| 8000/8000 [00:08<00:00, 930.68it/s] \n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "source": [
    "# 应用bpe分词,-c 指定 BPE 编码的配置文件\n",
    "!subword-nmt apply-bpe -c ./imdb_bpe_code -i ./imdb_train.txt -o ./imdb_train_bpe.txt\n",
    "!subword-nmt apply-bpe -c ./imdb_bpe_code -i ./imdb_test.txt -o ./imdb_test_bpe.txt"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-28T09:09:59.858138Z",
     "start_time": "2025-02-28T09:09:48.731375Z"
    }
   },
   "outputs": [],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:43:01.081963400Z",
     "start_time": "2024-07-30T06:43:00.959420600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i really liked sum@@ mer@@ sla@@ m due look a@@ ren@@ a , cur@@ tain look overall interesting reason . anyways , could one best sum@@ mer@@ sla@@ m ever w@@ w@@ f le@@ x lu@@ ger main event yo@@ ko@@ z@@ un@@ a , time ok huge fat man v strong man i glad time changed . it terrible main event like every match lu@@ ger terrible . other match card ra@@ z@@ or ra@@ mon v ted di@@ bi@@ ase , ste@@ in@@ er brothers v hea@@ ven@@ ly bo@@ dies , sha@@ wn micha@@ els v cur@@ t h@@ ening , event sha@@ wn named big monster body guard die@@ sel , irs v - - kid , bre@@ t hart first take do@@ ink take jerry law@@ ler stuff har@@ ts law@@ ler always interesting , lu@@ d@@ vi@@ g bor@@ ga destroyed marty jan@@ ne@@ tty , under@@ taker took giant gon@@ z@@ ale@@ z another terrible match , the smoking g@@ unn@@ s tat@@ an@@ ka took ba@@ m ba@@ m bi@@ ge@@ low head@@ shr@@ in@@ kers , yo@@ ko@@ z@@ un@@ a def@@ ended world title le@@ x lu@@ ger match boring terrible ending . however deserves\n",
      "not many television show appeal quite many different kind fan like far@@ scape . . . i know youn@@ g@@ ster year old fan male female many different country think ad@@ ore t . v miniseries . it element found almost every show t . v , character driven drama could australian soap opera yet episode science fact fiction would give even har@@ di@@ est tre@@ k@@ kie run money brain@@ ben@@ der sta@@ ke ! wor@@ m@@ hole theory , time travel true equ@@ a@@ tional form . . . magnificent . it embr@@ ace culture ma@@ p possibility endless multiple star therefore thousand planet choose . with broad scope would expected nothing would able keep illu@@ sion long , far@@ scape really come element . . . it succeeds others failed , especially like star trek universe practically zero ka@@ os element ! they ran idea pretty quickly kept re@@ ha@@ shing ! over course season manage keep audience attention using good continuity constant character evol@@ ution multiple thread every episode unique personal touch camera specific certain character group within whole . this structure allows extremely large area subject matter loy@@ alty for@@ ged broken many way many many issue . i happened see pilot premiere passing keep tun@@ ing see cri@@ ch@@ ton would ever get girl , seeing television i deli@@ ghted see available dvd i admit thing kept s@@ ane whilst i hour night shift developed chron@@ ic in@@ som@@ nia . . . far@@ scape thing get extremely long night . . . do fav@@ our watch pilot see i mean . . . far@@ scape com@@ et\n",
      "the film quickly get major chase scene ever increa@@ sing destruction . the first really bad thing guy hi@@ jac@@ king steven seagal would beaten pulp seagal driving , probably would ended whole premise movie . it seems like decided make kind change movie plot , plan enjoy action , expect coherent plot . turn sense logic may , re@@ duce chance getting head@@ ache . i give hope steven seagal trying move back towards type character portrayed popular movie .\n",
      "jane austen would definitely appro@@ ve one ! g@@ wy@@ ne@@ th pal@@ tro@@ w awesome job capturing attitude emma . she funny without exce@@ ssively silly , yet eleg@@ ant . she put convincing british accent british , maybe i best judge , fooled . . . also excellent sli@@ ding do@@ ors . . . i sometimes forget american ! . also brilliant jeremy north@@ am sophi@@ e th@@ omp@@ son ph@@ y@@ lli@@ da law emma th@@ omp@@ son sister mother bates woman . they nearly steal show . . . ms . law even line ! highly recommended .\n",
      "expec@@ ta@@ tions somewhat high i went see movie , i thought steve care@@ ll could wrong coming great movie like an@@ chor@@ man , the year - old virgin , little miss sun@@ shine . boy , i wrong . i start right movie certain point steve care@@ ll allowed steve care@@ ll . there handful moment film made laugh , due almost entirely given wi@@ ggle - room thing . he undoubtedly talented individual , shame sig@@ ned turned , opinion , total train - wreck . with way , i discus went horri@@ f@@ y@@ ingly wrong . the film begin dan burns , wi@@ do@@ wer three girl considered na@@ tionally syn@@ di@@ cated advice colum@@ n . he pre@@ pa@@ res girl family reunion , extended relative ga@@ ther time . the family high at@@ op list thing make awful movie . no family beha@@ ves like . it almost tran@@ spor@@ ted pleasan@@ t@@ ville leave bea@@ ver . they caricature think family . it reach point become obnoxious simply frustrating . touch football , cro@@ ss@@ word puzzle competition , family bow@@ ling , talent show are not how actual people behave . it almost sick@@ ening . another big flaw woman care@@ ll supposed falling . obser@@ ving first scene steve care@@ ll like watching stro@@ ke victim trying re@@ hab@@ il@@ it@@ ated . what i imagine supposed unique original woman come mildly retarded . it make think movie taking place another planet . i left theater wondering i saw . after thinking , i think much .\n",
      "i watched movie fairly regular basis life , never get old . for sni@@ de remark insult mostly david spa@@ de , tommy boy giant heart . and keep movie funny year . tommy cal@@ la@@ han chris far@@ ley son big tom cal@@ la@@ han brian den@@ ne@@ h@@ y , master car part sal@@ es@@ man , ri@@ dden life . but died dy wedding day , tommy learns company deb@@ t , bought ray z@@ al@@ in@@ sky dan ak@@ roy@@ d , owner huge car part company . so order save company , tommy go road sell company new bra@@ ke pa@@ d . along ride , though choice , richard hay@@ den david spa@@ de former cla@@ ss@@ mate tommy big tom right - hand man . the movie ride chemistry two sn@@ l star real - life best friend chris far@@ ley david spa@@ de . the duo enough comic energy going power world . it big , dumb guy versus smart little guy . it work , scene un@@ forget@@ tably funny . far@@ ley spa@@ de actually decent dramatic actor well . although film primarily comedy , fair share drama , spa@@ de especially far@@ ley good making audience laugh . forgive , i talk chris far@@ ley little . i read biography the chris far@@ ley show a biography three acts , anyone care , understanding chris real life made movie special . chris far@@ ley genuinely good person strugg@@ led , ultimately failed con@@ qu@@ er addic@@ tion . although first movie major role , best film . it really showed , much talent . knowing chris story add another layer movie , although make le funny . far@@ ley spa@@ de matched good screen cast . rob lo@@ we suit@@ ably sli@@ my tommy new brother , bo derek solid step - mother . brian den@@ ne@@ h@@ y great big tom . den@@ ne@@ h@@ y make easy believe father son . big tom crazy son , although smar@@ ter mature . dan ak@@ roy@@ d give one best performance z@@ al@@ in@@ sky , giving tommy hard truth behind advertising . julie warner also good tommy love interest , michelle . for , peter se@@ gal one great comedy director . he keep pace quick ener@@ ge@@ tic , importantly , know make comedy funny . he be@@ la@@ bor joke , understand@@ s funny actor know allows . but se@@ gal go step . he give tommy boy friendly , almost nostal@@ gic tone tu@@ g heart@@ str@@ ings genuinely ti@@ ckle f@@ unn@@ y@@ bone . cri@@ tics like tommy boy . shame . a movie super sophisticated sub@@ ver@@ sively intellectual funny god for@@ bid far@@ ley spa@@ de forced mu@@ ted comedy la the office . this great movie one - time favorite .\n",
      "for story hope high@@ ligh@@ ted tragic reality youth face . fav@@ ela rising draw one scary , un@@ safe un@@ fair world show beautiful color moving music one man dedicated friend choose accept world change action art . an entertaining , interesting , emotional , aes@@ the@@ tically beautiful film . i showed film numerous high school student well live neighborhood poverty gun violence en@@ amo@@ red anderson , protagonist . i recommend film age due subtitle image death background .\n",
      "okay , i get pur@@ gatory thing first time i watched episode . it seemed like something significant going i put finger . this time co@@ sta me@@ sa fire tv really caught attention - helped i writing ess@@ ay inf@@ er@@ no ! but let see ha@@ s@@ n t discu@@ ssed yet . . . a tw@@ op review mentioned tony flight sta@@ ir go broken elev@@ ator . yeah , significant number lot reason , especially religious , one ya . on hun@@ ch i con@@ sulted wi@@ ki@@ pe@@ dia , guess dan@@ te divi@@ ded level ? pur@@ g@@ at@@ ori@@ o . exclu@@ ding ante - pur@@ gatory para@@ di@@ se . the stuff bottom sta@@ ir . . . tony get . on alle@@ ge@@ dly random mon@@ k - slap scene . as soon mon@@ k appeared , fit perfectly place tony trying get pur@@ gatory . you tell got worried christian commercial death , disease , sin came , getting desperate christian heaven looking kinda i@@ ffy . by time meet mon@@ k thinking hey maybe guy help ? sound like contem@@ pla@@ ting religion e . g . bud@@ d@@ h@@ ism wondering path could take sal@@ vation . not tony necessarily literally thinking becoming bud@@ d@@ hi@@ st , appears fin@@ ner@@ ty tried me@@ ssed . that slap face basically tell tony quick fix - , , suddenly embr@@ ace bud@@ d@@ h@@ ism get . tony initially concerned getting heaven . but con@@ ference en@@ tr@@ ance , realizes going easy . at first i saw name v . driver li@@ cen@@ se problem tony led sort double life , killing people sleeping around kept secret people . he feel free affair qu@@ as@@ i - mel@@ fi kevin fin@@ ner@@ ty . he figure can fool people k@@ f card , like hotel rec@@ ep@@ tion@@ ist , get pur@@ gatory . those helicopter - helicopter heaven ? - keeping track everything . after reading theory in@@ fin@@ ner@@ ty , though , seems like k@@ f identity remin@@ der in@@ fin@@ ite different path tony could taken life . possibly along car joke involving in@@ fin@@ it@@ i made sense otherwise . a@@ a@@ and point brain fi@@ zz@@ le .\n",
      "i disappointed series . it lot cool graphic . the level detail went minimal , i always got feeling audience pat@@ ron@@ ized - - lot seemed this extremely cool going explain detail get anyway . let show pretty picture entertain . the host would drop interesting - sounding word spar@@ tic@@ les super - sym@@ me@@ try without attempt explaining . we look wi@@ ki@@ pe@@ dia . furthermore , i know quite bit super@@ string la@@ y@@ man i found explanation convoluted could much better . they could chosen much better example explain concept , instead , example used confusing ob@@ scu@@ red subject . ad@@ di@@ tionally , i got sick repeti@@ ti@@ veness . they could easily con@@ den@@ sed series one episode cut repeti@@ tion . they must shown clip qu@@ an@@ tum ca@@ f time . the host kept saying thing . i remember many time said the universe made tiny little vi@@ bra@@ ting string . it like trying brain@@ wa@@ sh u accep@@ ting super@@ string best thing since sli@@ ced b@@ read . finally , show ended unpleasant sense competition fer@@ mil@@ a@@ b cer@@ n , clearly bi@@ ased towards fer@@ mil@@ a@@ b . this supposed edu@@ cational program qu@@ an@@ tum physi@@ c , whether us better europe vice ver@@ sa ! i also felt part pat@@ ron@@ i@@ zing - - audi@@ en@@ ces need see conflict remain interested . please . give little credit . overall , thumb -\n",
      "the first minute tin@@ sel@@ town finger te@@ e@@ tering remote , po@@ ised flick around watch something else . the premise two writer , luck , living self - stor@@ age - space bin mildly amusing , , painfully bland . the introduction character , played joe pan@@ to@@ li@@ ano - big deal movie guy , life park sleep la@@ v@@ atory , offered hope i decided give minute . and kri@@ sty s@@ wan@@ sons introduction bud@@ ding film director bor@@ der@@ line ny@@ mp@@ hom@@ ani@@ ac , added bit sp@@ ice . her solid acting performance raised presence beyond welcome eye - candy inclu@@ sion . ultimately , obvious low - budget impact film poorly shot scene , stu@@ t@@ tured pace slapstick hand@@ ling certain moment . some favourite movie time low budget , whi@@ th@@ nail i one also deal guy dream , luck . however , money , actor save tin@@ sel@@ town terrible movie archi@@ ve nu@@ dge could cult movie archi@@ ve . i laughed loud scene involving joe pan@@ to@@ li@@ ano character . in particular , pen@@ ultimate scene terribly clichd , still funny , rich - - scre@@ wed - character house , story un@@ ra@@ vel@@ s towards final moment . i see tin@@ sel@@ town great stage play film - maker best transla@@ te celluloid , simply work i laughed loud scene one liner , i think first minute du@@ lled sen@@ s expectation degree i would laughed anything . unless stuck no@@ vel@@ ty coffee coa@@ ster , pick see bar@@ gain bu@@ cket .\n"
     ]
    }
   ],
   "source": [
    "# 分词后的数据长什么样,与分词前imdb_train.txt进行对比来理解，@@ 是分词的标记，如果一个单词被分开，就会加上@@\n",
    "!head ./imdb_train_bpe.txt\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "data": {
      "text/plain": "                                           processed  label\n0  I really liked Summerslam due look arena , cur...      1\n1  Not many television show appeal quite many dif...      1\n2  The film quickly get major chase scene ever in...      0\n3  Jane Austen would definitely approve one ! Gwy...      1\n4  Expectations somewhat high I went see movie , ...      0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>processed</th>\n      <th>label</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>I really liked Summerslam due look arena , cur...</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>Not many television show appeal quite many dif...</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>The film quickly get major chase scene ever in...</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>Jane Austen would definitely approve one ! Gwy...</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>Expectations somewhat high I went see movie , ...</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cleaned_df.head()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-30T03:37:51.089805300Z",
     "start_time": "2024-07-30T03:37:51.073572100Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:43:20.474742600Z",
     "start_time": "2024-07-30T06:43:16.922099900Z"
    }
   },
   "outputs": [],
   "source": [
    "subwords = []\n",
    "with open(\"imdb_train_bpe.txt\", \"r\", encoding=\"utf8\") as file:\n",
    "    for line in file.readlines():\n",
    "        subwords.append(line.strip())\n",
    "        \n",
    "with open(\"imdb_test_bpe.txt\", \"r\", encoding=\"utf8\") as file:\n",
    "    for line in file.readlines():\n",
    "        subwords.append(line.strip())\n",
    "        \n",
    "cleaned_df[\"subwords10k\"] = subwords # 保存分词后的结果\n",
    "cleaned_df[\"split\"] = [\"train\"] * 25000 + [\"test\"] * 25000 # 标记训练集和测试集\n",
    "cleaned_df.to_csv(\"imdb_subwords.csv\", index=False) #把分词后的结果保存到csv文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:43:43.762125300Z",
     "start_time": "2024-07-30T06:43:41.659117400Z"
    }
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "# 随后加载数据集就从bpe分词的文件里加载\n",
    "class IMDBDataset(Dataset):\n",
    "    def __init__(self, mode=\"train\"):\n",
    "        df = pd.read_csv(\"imdb_subwords.csv\").query(\"split == '{}'\".format(mode)) # 加载训练集或测试集，query语句筛选\n",
    "        self.texts = df[\"subwords10k\"].values # 评论文本\n",
    "        self.labels = df[\"label\"].values # 评论标签\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.labels)\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        return self.texts[idx].split(), self.labels[idx] # 返回文本和标签\n",
    "    \n",
    "    \n",
    "train_ds = IMDBDataset(\"train\")\n",
    "test_ds = IMDBDataset(\"test\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "data": {
      "text/plain": "(['i',\n  'really',\n  'liked',\n  'sum@@',\n  'mer@@',\n  'sla@@',\n  'm',\n  'due',\n  'look',\n  'a@@',\n  'ren@@',\n  'a',\n  ',',\n  'cur@@',\n  'tain',\n  'look',\n  'overall',\n  'interesting',\n  'reason',\n  '.',\n  'anyways',\n  ',',\n  'could',\n  'one',\n  'best',\n  'sum@@',\n  'mer@@',\n  'sla@@',\n  'm',\n  'ever',\n  'w@@',\n  'w@@',\n  'f',\n  'le@@',\n  'x',\n  'lu@@',\n  'ger',\n  'main',\n  'event',\n  'yo@@',\n  'ko@@',\n  'z@@',\n  'un@@',\n  'a',\n  ',',\n  'time',\n  'ok',\n  'huge',\n  'fat',\n  'man',\n  'v',\n  'strong',\n  'man',\n  'i',\n  'glad',\n  'time',\n  'changed',\n  '.',\n  'it',\n  'terrible',\n  'main',\n  'event',\n  'like',\n  'every',\n  'match',\n  'lu@@',\n  'ger',\n  'terrible',\n  '.',\n  'other',\n  'match',\n  'card',\n  'ra@@',\n  'z@@',\n  'or',\n  'ra@@',\n  'mon',\n  'v',\n  'ted',\n  'di@@',\n  'bi@@',\n  'ase',\n  ',',\n  'ste@@',\n  'in@@',\n  'er',\n  'brothers',\n  'v',\n  'hea@@',\n  'ven@@',\n  'ly',\n  'bo@@',\n  'dies',\n  ',',\n  'sha@@',\n  'wn',\n  'micha@@',\n  'els',\n  'v',\n  'cur@@',\n  't',\n  'h@@',\n  'ening',\n  ',',\n  'event',\n  'sha@@',\n  'wn',\n  'named',\n  'big',\n  'monster',\n  'body',\n  'guard',\n  'die@@',\n  'sel',\n  ',',\n  'irs',\n  'v',\n  '-',\n  '-',\n  'kid',\n  ',',\n  'bre@@',\n  't',\n  'hart',\n  'first',\n  'take',\n  'do@@',\n  'ink',\n  'take',\n  'jerry',\n  'law@@',\n  'ler',\n  'stuff',\n  'har@@',\n  'ts',\n  'law@@',\n  'ler',\n  'always',\n  'interesting',\n  ',',\n  'lu@@',\n  'd@@',\n  'vi@@',\n  'g',\n  'bor@@',\n  'ga',\n  'destroyed',\n  'marty',\n  'jan@@',\n  'ne@@',\n  'tty',\n  ',',\n  'under@@',\n  'taker',\n  'took',\n  'giant',\n  'gon@@',\n  'z@@',\n  'ale@@',\n  'z',\n  'another',\n  'terrible',\n  'match',\n  ',',\n  'the',\n  'smoking',\n  'g@@',\n  'unn@@',\n  's',\n  'tat@@',\n  'an@@',\n  'ka',\n  'took',\n  'ba@@',\n  'm',\n  'ba@@',\n  'm',\n  'bi@@',\n  'ge@@',\n  'low',\n  'head@@',\n  'shr@@',\n  'in@@',\n  'kers',\n  ',',\n  'yo@@',\n  'ko@@',\n  'z@@',\n  'un@@',\n  'a',\n  'def@@',\n  'ended',\n  'world',\n  'title',\n  'le@@',\n  'x',\n  'lu@@',\n  'ger',\n  'match',\n  'boring',\n  'terrible',\n  'ending',\n  '.',\n  'however',\n  'deserves'],\n 1)"
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_ds[0]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-30T06:43:46.060620900Z",
     "start_time": "2024-07-30T06:43:46.032635900Z"
    }
   }
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构造 word2idx 和 idx2word"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:44:23.331930800Z",
     "start_time": "2024-07-30T06:44:23.322863Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0: '[PAD]', 1: '[BOS]', 2: '[UNK]', 3: '[EOS]'}\n"
     ]
    }
   ],
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典\n",
    "word2idx = {\n",
    "    \"[PAD]\": 0,     # 填充 token\n",
    "    \"[BOS]\": 1,     # begin of sentence\n",
    "    \"[UNK]\": 2,     # 未知 token\n",
    "    \"[EOS]\": 3,     # end of sentence\n",
    "}\n",
    "idx2word = {value: key for key, value in word2idx.items()}\n",
    "print(idx2word)\n",
    "index = len(idx2word) # 词表长度，现在为4\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "data": {
      "text/plain": "  0%|          | 0/8031 [00:00<?, ?it/s]",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "c28f8628bc3e488984b2c068af2d1925"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vocab_size: 8035\n"
     ]
    }
   ],
   "source": [
    "threshold = 1  # 出现次数低于此的token舍弃\n",
    "with open(\"imdb_bpe_vocab\", \"r\", encoding=\"utf8\") as file:\n",
    "    for line in tqdm(file.readlines()):\n",
    "        token, counts = line.strip().split()\n",
    "        if int(counts) >= threshold:\n",
    "            word2idx[token] = index # 加入词表\n",
    "            idx2word[index] = token # 加入反向词典\n",
    "            index += 1\n",
    "\n",
    "vocab_size = len(word2idx)\n",
    "print(\"vocab_size: {}\".format(vocab_size))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-30T06:53:38.216577600Z",
     "start_time": "2024-07-30T06:53:38.151936600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:54:11.348185Z",
     "start_time": "2024-07-30T06:54:06.850986200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGdCAYAAAA44ojeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2yElEQVR4nO3deXxU1f3/8fdsCYlmMUC2SggCsiiLRg1xQVpSA+KCoBWlCErBBaxKpYi/Kmi/3y9ULdRaRFsVqCK4VKHF7cGOSwChoOCCQKNgSQKFJgGRZJbz+6Pf3K8jCZPAhLnJfT0fj3lw5t4zdz6Hm9x85pxzz7iMMUYAAAA24o51AAAAAN9HggIAAGyHBAUAANgOCQoAALAdEhQAAGA7JCgAAMB2SFAAAIDtkKAAAADb8cY6gOMRCoW0Z88eJSUlyeVyxTocAADQAMYYHTx4UNnZ2XK7j91H0iwTlD179qhdu3axDgMAAByH3bt36/TTTz9mnWaZoCQlJUn6TwOTk5NjHA0AAGiIqqoqtWvXzvo7fizNMkGpHdZJTk4mQUGjBINBrV27VpLUp08feTyeGEcEAM7TkOkZzTJBAY5XMBjUsmXLJEnnn38+CQoA2BQJChzF7XarV69eVhkAYE8kKHAUr9erwYMHxzoMAEAEJCgAgKgzxigQCCgYDMY6FJxEHo9HXq83KkuAkKAAAKKqpqZGpaWlOnz4cKxDQQwkJiYqKytLcXFxJ3QcEhQ4Sk1NjWbMmCFJmjBhwgn/AgEIFwqFVFJSIo/Ho+zsbMXFxbGgpkMYY1RTU6N9+/appKREnTt3PqG5fiQocJzq6upYhwC0WDU1NQqFQmrXrp0SExNjHQ5OsoSEBPl8Pn311VeqqalRq1atjvtYJChwFJ/Pp/Hjx1tlAE2Du+ScK1rnngQFjuJyudS6detYhwEAiIAUFwAAm3G5XFq0aFGsw5AkTZ06Vb179z7p70uCAkcJBoNav3691q9fz+2PAPA9dkqMGOKBowSDQb311luSpN69e7PUPQDYFD0ocBS3263u3bure/fuTOIDEKZfv3668847dffdd+u0005TRkaG/vSnP+mbb77RzTffrKSkJHXq1Mn6kCP950PP6NGj1aFDByUkJKhLly56/PHHrf1HjhzRWWedpbFjx1rbdu7cqaSkJD333HMNjm337t36yU9+otTUVKWlpenqq6/Wl19+ae0fNWqUBg8erMcee0xZWVlq3bq1xo0bJ7/fb9UpLS3VoEGDlJCQoA4dOujFF19Ubm6ufve730mScnNzJUnXXHONXC6X9bzW888/r9zcXKWkpGjYsGE6ePBgg+M/Hlyh4Sher1fXXXedrrvuOnm9dCACJ1NNTY1qampkjLG2BYNB1dTUKBAIRLXu8Zo3b57atGmj9evX684779Ttt9+u6667ThdeeKH+/ve/67LLLtOIESOsRehCoZBOP/10vfLKK/r000/14IMP6v7779fLL78sSWrVqpXmz5+vefPmafHixQoGg/rpT3+qH//4x7rlllsaFJPf71dRUZGSkpL07rvv6v3339epp56qAQMGqKamxqq3cuVK7dy5UytXrtS8efM0d+5czZ0719p/0003ac+ePVq1apX+8pe/6I9//KP27t1r7f/www8lSXPmzFFpaan1XPpPUrVo0SItWbJES5Ys0erVqzV9+vTj/n9uENMMVVZWGkmmsrIy1qEAAL7j22+/NZ9++qn59ttvj9o3depUM3XqVHPo0CFr2+rVq83UqVPN4sWLw+r+93//t5k6dar597//bW0rLi42U6dONX/5y1/C6j7yyCNm6tSppry8/IRiv/TSS83FF19sPQ8EAuaUU04xI0aMsLaVlpYaSaa4uLje44wbN84MHTr0qBjbtGljxo8fb7Kyssy//vWvY8Yiybz++uvGGGOef/5506VLFxMKhaz91dXVJiEhwbzzzjvGGGNGjhxp2rdvbwKBgFXnuuuuM9dff70xxpjPPvvMSDIffvihtX/79u1Gkpk5c2ad71trypQpJjEx0VRVVVnbJk6caPLz8+uM/Vg/A435+81HSAAA/lfPnj2tssfjUevWrdWjRw9rW0ZGhiSF9TzMmjVLzz33nHbt2qVvv/1WNTU1R9318otf/EKLFi3SH/7wB7311luNWu7go48+0o4dO5SUlBS2/ciRI9q5c6f1/KyzzgqbV5eVlaUtW7ZIkrZt2yav16tzzz3X2t+pUyeddtppDYohNzc37P2zsrLC/g+aAgkKHMXv9+uJJ56QJN15550s1gacRJMnT5YUvkjiRRddpD59+hw1J+zee+89qu7555+vc88996i6d91111F1j9f3j+FyucK21S7bHwqFJEkLFy7Uvffeq9/+9rcqKChQUlKSHn30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zOuvvx62f/r06SYlJcUsWrTIfPTRR+aqq64yHTp0MN9++61VZ8CAAaZXr15m7dq15t133zWdOnUyN9xwg7W/srLSZGRkmOHDh5utW7eaBQsWmISEBPP000+frGYe5VjtrqioMIWFheall14yn3/+uSkuLjYXXHCBycvLCztG+/btzcMPPxz2M/Dda4Hd2h3pXI8cOdIMGDAgrD0HDhwIq9PSzrUxJqy9paWl5rnnnjMul8vs3LnTqtPcznUkJCjGmAsuuMCMGzfOeh4MBk12draZNm1aDKOKnr179xpJZvXq1da2Sy+91Nx11131vubNN980brfblJWVWdtmz55tkpOTTXV1dVOGe1ymTJlievXqVee+iooK4/P5zCuvvGJt++yzz4wkU1xcbIxpfu2tz1133WU6duxoQqGQMablnWdjzFEX71AoZDIzM82jjz5qbauoqDDx8fFmwYIFxhhjPv30UyPJfPjhh1adt956y7hcLvPPf/7TGGPMk08+aU477bSwdk+aNMl06dKliVvUMHX90fq+9evXG0nmq6++sra1b9/ezJw5s97X2Lnd9SUoV199db2vccq5vvrqq82PfvSjsG3N+VzXxfFDPDU1Ndq4caMKCwutbW63W4WFhSouLo5hZNFTWVkpSUpLSwvbPn/+fLVp00Znn322Jk+erMOHD1v7iouL1aNHj7CF84qKilRVVaVPPvnk5ATeSNu3b1d2drbOOOMMDR8+XLt27ZIkbdy4UX6/P+wcd+3aVTk5OdY5bo7t/b6amhq98MILuuWWW8K+RLOlnefvKykpUVlZWdj5TUlJUX5+ftj5TU1N1XnnnWfVKSwslNvt1rp166w6ffv2VVxcnFWnqKhI27Zt07///e+T1JoTU1lZKZfLddR3lU2fPl2tW7fWOeeco0cffTRsCK85tnvVqlVKT09Xly5ddPvtt2v//v3WPiec6/Lycr3xxhsaPXr0Ufta0rluFt9m3JT+9a9/KRgMHrWCbUZGhj7//PMYRRU9oVBId999ty666CKdffbZ1vYbb7xR7du3V3Z2tj7++GNNmjRJ27Zt02uvvSZJKisrq/P/pHaf3eTn52vu3Lnq0qWLSktL9dBDD+mSSy7R1q1bVVZWpri4uKMu2hkZGVZbmlt767Jo0SJVVFRo1KhR1raWdp7rUhtnXe347vlNT08P2+/1epWWlhZWp0OHDkcdo3bfaaed1iTxR8uRI0c0adIk3XDDDWFfGPfzn/9c5557rtLS0vTBBx9o8uTJKi0t1YwZMyQ1v3YPGDBAQ4YMUYcOHbRz507df//9GjhwoIqLi+XxeBxxrufNm6ekpCQNGTIkbHtLO9eOT1BaunHjxmnr1q167733wraPHTvWKvfo0UNZWVnq37+/du7cqY4dO57sME/YwIEDrXLPnj2Vn5+v9u3b6+WXX1ZCQkIMIzt5nn32WQ0cODDsa8xb2nlG3fx+v37yk5/IGKPZs2eH7ZswYYJV7tmzp+Li4nTrrbdq2rRpzXJp9GHDhlnlHj16qGfPnurYsaNWrVql/v37xzCyk+e5557T8OHD1apVq7DtLe1cO36Ip02bNvJ4PEfd0VFeXq7MzMwYRRUd48eP15IlS7Ry5Uqdfvrpx6ybn58vSdqxY4ckKTMzs87/k9p9dpeamqozzzxTO3bsUGZmpmpqalRRURFW57vnuLm396uvvtKyZcv0s5/97Jj1Wtp5lv4vzmP9DmdmZmrv3r1h+wOBgA4cONDsfwZqk5OvvvpKS5cuDes9qUt+fr4CgYC+/PJLSc233bXOOOMMtWnTJuxnuqWea0l69913tW3btoi/61LzP9eOT1Di4uKUl5en5cuXW9tCoZCWL1+ugoKCGEZ2/IwxGj9+vF5//XWtWLHiqC69umzevFmSlJWVJUkqKCjQli1bwn7Ray9+3bt3b5K4o+nQoUPauXOnsrKylJeXJ5/PF3aOt23bpl27dlnnuLm3d86cOUpPT9egQYOOWa+lnWdJ6tChgzIzM8POb1VVldatWxd2fisqKrRx40arzooVKxQKhaykraCgQGvWrJHf77fqLF26VF26dLFd13et2uRk+/btWrZsmVq3bh3xNZs3b5bb7baGQZpju7/r66+/1v79+8N+plviua717LPPKi8vT7169YpYt9mf61jP0rWDhQsXmvj4eDN37lzz6aefmrFjx5rU1NSwOxuak9tvv92kpKSYVatWhd1udvjwYWOMMTt27DAPP/yw2bBhgykpKTGLFy82Z5xxhunbt691jNrbTy+77DKzefNm8/bbb5u2bdva7vbTWr/4xS/MqlWrTElJiXn//fdNYWGhadOmjdm7d68x5j+3Gefk5JgVK1aYDRs2mIKCAlNQUGC9vrm197uCwaDJyckxkyZNCtveks7zwYMHzaZNm8ymTZuMJDNjxgyzadMm626V6dOnm9TUVLN48WLz8ccfm6uvvrrO24zPOeccs27dOvPee++Zzp07h916WlFRYTIyMsyIESPM1q1bzcKFC01iYmJMb8E8VrtramrMVVddZU4//XSzefPmsN/12rs0PvjgAzNz5kyzefNms3PnTvPCCy+Ytm3bmptuusl6D7u1+1htPnjwoLn33ntNcXGxKSkpMcuWLTPnnnuu6dy5szly5Ih1jJZ2rmtVVlaaxMREM3v27KNe3xzPdSQkKP/riSeeMDk5OSYuLs5ccMEFZu3atbEO6bhJqvMxZ84cY4wxu3btMn379jVpaWkmPj7edOrUyUycODFsfQxjjPnyyy/NwIEDTUJCgmnTpo35xS9+Yfx+fwxaFNn1119vsrKyTFxcnPnBD35grr/+erNjxw5r/7fffmvuuOMOc9ppp5nExERzzTXXmNLS0rBjNKf2ftc777xjJJlt27aFbW9J53nlypV1/kyPHDnSGPOfW40feOABk5GRYeLj403//v2P+v/Yv3+/ueGGG8ypp55qkpOTzc0332wOHjwYVuejjz4yF198sYmPjzc/+MEPzPTp009WE+t0rHaXlJTU+7teuw7Oxo0bTX5+vklJSTGtWrUy3bp1M//zP/8T9sfcGHu1+1htPnz4sLnssstM27Ztjc/nM+3btzdjxow56sNkSzvXtZ5++mmTkJBgKioqjnp9czzXkbiMMaZJu2gAAAAayfFzUAAAgP2QoAAAANshQQEAALZDggIAAGyHBAUAANgOCQoAALAdEhQAAGA7JCgAAMB2SFAAAIDtkKAAAADbIUEBAAC2Q4ICAABs5/8Daygyx0emXi8AAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 选择 max_length\n",
    "length_collect = {}\n",
    "for text, label in train_ds:\n",
    "    length = len(text)\n",
    "    length_collect[length] = length_collect.get(length, 0) + 1\n",
    "    \n",
    "MAX_LENGTH = 500\n",
    "plt.bar(length_collect.keys(), length_collect.values())\n",
    "plt.axvline(MAX_LENGTH, label=\"max length\", c=\"gray\", ls=\":\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:57:59.336474900Z",
     "start_time": "2024-07-30T06:57:59.325421100Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 6513,  125,    3,    0,    0,    0])\n",
      "tensor([   1,    2, 3232,    2,  686,    2,    3])\n",
      "tensor([   1,   18,  395,   26, 1892,    3,    0])\n",
      "decode text\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with [UNK] [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=500, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx\n",
    "        self.idx2word = idx2word\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx\n",
    "        self.bos_idx = bos_idx\n",
    "        self.eos_idx = eos_idx\n",
    "        self.unk_idx = unk_idx\n",
    "    \n",
    "    def encode(self, text_list, padding_first=False):\n",
    "        \"\"\"如果padding_first == True，则padding加载前面，否则加载后面\"\"\"\n",
    "        max_length = min(self.max_length, 2 + max([len(text) for text in text_list]))\n",
    "        indices_list = []\n",
    "        for text in text_list:\n",
    "            indices = [self.bos_idx] + [self.word2idx.get(word, self.unk_idx) for word in text[:max_length-2]] + [self.eos_idx] #变为id，未登录词用unk_idx代替，句子前后加bos和eos\n",
    "            if padding_first: # padding加载前面\n",
    "                indices = [self.pad_idx] * (max_length - len(indices)) + indices\n",
    "            else:# padding加载后面\n",
    "                indices = indices + [self.pad_idx] * (max_length - len(indices))\n",
    "            indices_list.append(indices)\n",
    "        return torch.tensor(indices_list)\n",
    "    \n",
    "    \n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list\n",
    "    \n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text, padding_first=False)\n",
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)\n",
    "print(\"decode text\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T06:59:53.730098200Z",
     "start_time": "2024-07-30T06:59:53.723490Z"
    }
   },
   "outputs": [],
   "source": [
    "def collate_fct(batch):\n",
    "    \"\"\"\n",
    "    把字符串列表转化为tensor\n",
    "    :param batch:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    text_list = [item[0] for item in batch] #batch中每个item的第一个元素是text,是输入，类型为list\n",
    "    label_list = [item[1] for item in batch] #batch中每个item的第二个元素是label,是输出，类型为int\n",
    "    # 这里使用 padding first\n",
    "    text_list = tokenizer.encode(text_list, padding_first=True).to(dtype=torch.int)\n",
    "    return text_list, torch.tensor(label_list).reshape(-1, 1).to(dtype=torch.float)\n",
    "\n",
    "batch_size = 128\n",
    "train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True, collate_fn=collate_fct)\n",
    "test_dl = DataLoader(test_ds, batch_size=batch_size, shuffle=False, collate_fn=collate_fct)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-30T07:00:33.794767500Z",
     "start_time": "2024-07-30T07:00:33.778195400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================== 一层单向 LSTM ===================================\n",
      "            embeding.weight             paramerters num: 128560\n",
      "           lstm.weight_ih_l0            paramerters num: 4096\n",
      "           lstm.weight_hh_l0            paramerters num: 16384\n",
      "            lstm.bias_ih_l0             paramerters num: 256\n",
      "            lstm.bias_hh_l0             paramerters num: 256\n",
      "              layer.weight              paramerters num: 4096\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n",
      "================================== 一层双向 LSTM ===================================\n",
      "            embeding.weight             paramerters num: 128560\n",
      "           lstm.weight_ih_l0            paramerters num: 4096\n",
      "           lstm.weight_hh_l0            paramerters num: 16384\n",
      "            lstm.bias_ih_l0             paramerters num: 256\n",
      "            lstm.bias_hh_l0             paramerters num: 256\n",
      "       lstm.weight_ih_l0_reverse        paramerters num: 4096\n",
      "       lstm.weight_hh_l0_reverse        paramerters num: 16384\n",
      "        lstm.bias_ih_l0_reverse         paramerters num: 256\n",
      "        lstm.bias_hh_l0_reverse         paramerters num: 256\n",
      "              layer.weight              paramerters num: 8192\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n",
      "================================== 两层单向 LSTM ===================================\n",
      "            embeding.weight             paramerters num: 128560\n",
      "           lstm.weight_ih_l0            paramerters num: 4096\n",
      "           lstm.weight_hh_l0            paramerters num: 16384\n",
      "            lstm.bias_ih_l0             paramerters num: 256\n",
      "            lstm.bias_hh_l0             paramerters num: 256\n",
      "           lstm.weight_ih_l1            paramerters num: 16384\n",
      "           lstm.weight_hh_l1            paramerters num: 16384\n",
      "            lstm.bias_ih_l1             paramerters num: 256\n",
      "            lstm.bias_hh_l1             paramerters num: 256\n",
      "              layer.weight              paramerters num: 4096\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n"
     ]
    }
   ],
   "source": [
    "class LSTM(nn.Module):\n",
    "    def __init__(self, embedding_dim=16, hidden_dim=64, vocab_size=vocab_size, num_layers=1, bidirectional=False):\n",
    "        super(LSTM, self).__init__()\n",
    "        self.embeding = nn.Embedding(vocab_size, embedding_dim)\n",
    "        self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=num_layers, batch_first=True, bidirectional=bidirectional)\n",
    "        self.layer = nn.Linear(hidden_dim * (2 if bidirectional else 1), hidden_dim)\n",
    "        self.fc = nn.Linear(hidden_dim, 1)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # [bs, seq length]\n",
    "        x = self.embeding(x)\n",
    "        # [bs, seq length, embedding_dim] -> shape [bs, seq length, hidden_dim ]\n",
    "        seq_output, (hidden, cell) = self.lstm(x)\n",
    "\n",
    "        x = seq_output[:, -1, :]\n",
    "        # 取最后一个时间步的输出 (这也是为什么要设置padding_first=True的原因)\n",
    "        x = self.layer(x)\n",
    "        x = self.fc(x)\n",
    "        return x\n",
    "    \n",
    "sample_inputs = torch.randint(0, vocab_size, (2, 128))\n",
    "    \n",
    "print(\"{:=^80}\".format(\" 一层单向 LSTM \"))       \n",
    "for key, value in LSTM().named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")\n",
    "\n",
    "    \n",
    "print(\"{:=^80}\".format(\" 一层双向 LSTM \"))       \n",
    "for key, value in LSTM(bidirectional=True).named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")\n",
    "\n",
    "    \n",
    "print(\"{:=^80}\".format(\" 两层单向 LSTM \"))       \n",
    "for key, value in LSTM(num_layers=2).named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        # 二分类\n",
    "        preds = logits > 0\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### TensorBoard 可视化\n",
    "\n",
    "\n",
    "训练过程中可以使用如下命令启动tensorboard服务。\n",
    "\n",
    "```shell\n",
    "tensorboard \\\n",
    "    --logdir=runs \\     # log 存放路径\n",
    "    --host 0.0.0.0 \\    # ip\n",
    "    --port 8848         # 端口\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "        \n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\", \n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            )\n",
    "        \n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "        \n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "            \n",
    "        )\n",
    "    \n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Save Best\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = -1\n",
    "        \n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "        \n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "        \n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "        \n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else: \n",
    "            self.counter += 1\n",
    "            \n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-04-27 23:26:29.131152: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX_VNNI FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "32ef8dd32fbe48aea3ccff21f8a05f07",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/3920 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model, \n",
    "    train_loader, \n",
    "    val_loader, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits > 0\n",
    "            \n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())    \n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "                    \n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step, \n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],\n",
    "                            )\n",
    "                \n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "                    \n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20\n",
    "\n",
    "model = LSTM()\n",
    "\n",
    "# 1. 定义损失函数 采用交叉熵损失 (但是二分类)\n",
    "loss_fct = F.binary_cross_entropy_with_logits\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "tensorboard_callback = TensorBoardCallback(\"runs/imdb-lstm-subword\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/imdb-lstm-subword\", save_step=len(train_dl), save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10)\n",
    "\n",
    "model = model.to(device)\n",
    "record = training(\n",
    "    model, \n",
    "    train_dl, \n",
    "    test_dl, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=len(train_dl)\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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yJAhVdSjmkNJvh+NGzeuhB4JgiCUjRKJoczMTPx+v2mu9ebNm4vdfsWKFaxfv5633347ZruS5GbHw9EC+GKXld05c2mbWuLNBQOSC1s+1OTzaKyJUBSFQm/li6KCYydIcFjjTo+56667+Pnnn/n55595+eWXAbUG8u677+azzz7jqaeeYuPGjXz11Ve0bNmSf/zjH6xcuZL8/Hw6d+7MI488wplnnhnaX69evbjzzju58847AUhPT+ell15izpw5zJ8/n+bNm/Pkk08ybty4YvsWzH/OyckJ3eH+7rvveOaZZ9i5cydNmzbltttuY+LEiaFt3nrrLd544w0OHDhAWloaQ4YM4b333gPg22+/5bnnnmPXrl0kJibSq1cvPvroI9MbUXl5eVFrI6piUt2Skpuby/bt20PPd+3axZo1a2jQoAFt2rRh8uTJHDhwgPfffx+AO+64g1dffZUHHniAm2++mfnz5/PZZ59VaB2roigUeP2h54FAgAKPH7vHV+GRoUSHLa7vyI033hj6frz00ksAvPPOO9x0003MmjWLhx56iHXr1jFnzhxat27NpEmT+PXXX8nLy6Nbt24888wzOmMKYxqpxWJh2rRpzJw5k9mzZ9OyZUtefPFFLrjggmL75vf7ue2225g/fz6HDx+mTZs23HXXXdxzzz26dtOnT+fFF19k+/btNGjQgEsvvZRXX30VgBMnTvC3v/2Nb775hpMnT9KxY0eeffZZzj///HhPpSAAsGpPFi/N284j53enY5OUqu6OUEYq1U3u7bffpmfPnlHNFoKUJDe7WPKzmP3fB+mc05x/rx/GtifH6FYv3XGMAycKubx/y5Lttw4iubDlQ204j8aaiHyPj77PVY24W//YaJKc8f2Uvfbaa+zevZsePXqEbrhs2LABgH/+8588//zztG/fnvT0dPbt28f48eN59tlncblcfPDBB1x11VVs2rSJNm3aAGpkPCEhQfe79MILL/Dss88yZcoUXn31VW6//XZ27doVkTJsJHijJzU1lbS0NFatWsVNN93Eo48+yhVXXMHSpUuZOHEiLVq04MYbb2TlypU8+OCDvPfeewwdOpSsrCwWL15MWloahw4d4pZbbuG5557joosuIicnh8WLF5OamkpKSvjCHay3SE5OjlobUZ552RXFypUrOeuss0LPg9ePG264gXfffZdDhw6xd+/e0Pp27doxc+ZM7rvvPl566SVatWrFW2+9Va622kYKvH66PzK7wvYfi41PjI3rO/LSSy+xdetWTj31VJ544gkg/P148MEH+de//qX7fowbN46nnnoKl8vF+++/z/jx49myZUvo+2HG448/zvPPP88LL7zAK6+8wjXXXMOePXuK/X4EAgFatWrF559/TsOGDVm6dCm33XYbTZs25ZxzzgHgjTfeYNKkSTz77LOce+65nDx5kiVLloS2P/fcc8nJyeHDDz+kQ4cObNy4sda7xAkVw6VvqNlQt32wkvl/ObNqOyOUmRKJoUaNGmGz2UxzrZs1axZz27y8PD799NPQD2wsSpKbXSwbPuP8vK/o42jEbPdAlu46wWntG/D5yv2c0bkxN7y7CoBB7RvSsYmEjeJBcmHLh5p8Ho01EVVZ81CS46enp+N0OklOTqZFixYAbN26FYAnnnhCNxhu1KgRffv2DT3/5z//yTfffMMPP/ygi84YaxVuvPFGrrnmGkCNcr/yyiusXLkyNGCL9Tq0r2fq1KmMHDmSRx55BICuXbuyefNmXnzxRW6++Wb2799PcnIyF1xwAampqbRr147+/fsD6m+yz+fj0ksv5ZRTTgGgd+/eEcfU1ltEq42oCZ/RM888M5TyZ8a7775rus3vv/9egb2qedSrVw+n00lSUlLomh7M+njiiScYPXp0qG2DBg10n6knn3ySr7/+mu+++073/TBy4403ctVVVwHw9NNP8/LLL7NixYpivx8Oh0OXMdKuXTuWLVvG559/Htr2n//8J3/5y190hg0DBw4E4KeffmLFihVs2rSJzp07A6rBgyCUhX1Z1T9yLhRPicSQ0+mkf//+zJs3j4suughQL6bz5s2L+eMH8Pnnn+N2u7n22mtL3dnSoAz4E0fmTKGVJZNrbXO5YbqTy/q34otV+0lNCL/8PLc/xl4EQYhFosPGxicq7q66kUAgQE52DqlpqSQ6yufO7oABA3TPc3Nzeeyxx5g5cyaHDh3C5/NRUFCgizCY0atXr9Dj5ORk0tLSOHLkSIn7s2nTJi688ELdsmHDhjF16lT8fj+jR4/mlFNOoX379pxzzjmcc845XHzxxSQlJdG7d29GjhxJz549GTt2LGPGjOGyyy4jPT29xP0Qygfjd0T7Ga6MNLmyUh2+H6+99hrTp09n7969FBQU4PF46NOnDwBHjhzh4MGDjBw50nTbNWvW0KpVq5AQEoTywB+IfhNGqDmU+Bd40qRJTJs2jffee49NmzZx5513kpeXF3KXu/7663UGC0HefvttLrroolDBcWWxPxde9F4KwET7t6SSzxer9gOQUxjOjbdZa6e1qSBUBhaLhSSnvVL/Ep02kpz2crPTNdbS3H///Xz99dc8/fTTLFq0iDVr1tCzZ89i540xRlIsFkuFGCKkpqayevVqPvnkE5o3b84jjzxC7969OXHiBDabjblz5/K///2P7t2788orr9ClSxd27dpV7v0Q4sPsOxL8DFf0X3l8R6r6+/Hpp59y//3386c//Yk5c+awZs0abrrpptDxorkABiluvSCUBtFCtYMSi6EJEybwr3/9i0ceeYQ+ffqwZs0afvzxx5Cpwt69ezl06JBumy1btrB48WL+9Kc/lU+vS8CGg9l86R/BblqQbsnlNvsPpu08fpkBXBDqAk6nE7+/+EjwkiVLuPHGG7n44ovp2bMnzZo1Y/fu3RXfwSK6desWqnfQ9qlz586hOge73c6oUaN4/vnn+eOPP9i9ezfz588H1EHmsGHDePzxx/n9999xOp18/fXXldZ/oWZSXb8fS5YsYejQodx111307duXjh07smPHjtD61NRU2rZty7x580y379WrF/v37w+lxQp1kz/2n+DeT3/nwImCqu5KjWX7kVz+75Pf2ZYRe6LjpTsyuW/GGo7nxb5BUh0olYHCxIkTo6bFLVy4MGJZly5dYuZzVySt0hO5+rR2zN11ObeefIk/2f7H+77RHEWfLuL1iRgShLpA27ZtWb58Obt37yYlJSXqXelOnTrx1VdfMX78eCwWCw8//HCl2oj/5S9/YeDAgTz55JNMmDCBZcuW8eqrr/L6668D8MMPP7Bz505GjBhBeno6s2bNIhAI0KVLF5YvX868efMYM2YMTZo0Yfny5Rw9epRu3bpVWv+Fmkl1/X506tSJ999/n9mzZ9OuXTs++OADfvvtN9q1axdq89hjj3HHHXfQpEmTkFnCkiVLuOeeezjjjDMYMWIEl156KVOmTKFjx45s3rwZi8VSbL2SUHu44FX1BtP+4wV8eefQKu5NzeS6t5dz6GQhq/YcZ8mDZ0dtd/W05YCaefWvyyNrVqsT1Wemtwri1Jb1eOS8rjRp14+s9N4kWdzca/8qop3XL7FO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W3HppZciLS0NgwcPxqOPPtrRL63TLF26FBdccAGys7PRr18/3HDDDdizZ49un5aWFtx1113Iz89HVlYWvvSlL6Gmpka3T1VVFa655hpkZGSgX79++PGPfwy/36/bp7KyEueffz7cbjdGjhyJl156qaNfXqd55plnMGnSpPCiamVlZXjnnXfC9/Mcts0jjzwCSZLwgx/8ILyN57Lr4XtTBN+XkoPvTcnB96bk6/LvS2oP9sorr6gul0tdtmyZumPHDnXhwoVqbm6uWlNTk+qhpcyKFSvUe++9V3311VdVAOprr72mu/+RRx5R+/Tpo77++uvqp59+qn7xi19Uhw0bpjY3N4f3ueqqq9TJkyerH330kfr++++rI0eOVG+++ebw/efOnVOLiorUW265Rd2+fbv68ssvq+np6epzzz3XWS+zQ82dO1d98cUX1e3bt6tbtmxR582bpw4ZMkRtaGgI73P77bergwcPVisqKtSPP/5YvfDCC9WLLroofL/f71cnTJigzpo1S/3kk0/UFStWqAUFBerixYvD+xw4cEDNyMhQy8vL1Z07d6pPPfWUqiiKunLlyk59vR3lzTffVN9++21179696p49e9Sf/exnqtPpVLdv366qKs9hW2zYsEEtKSlRJ02apN59993h7TyXXQvfm/T4vpQcfG9KDr43JVd3eF/q0cHQ9OnT1bvuuit8OxAIqAMGDFCXLl2awlF1HcY3nWAwqBYXF6uPPfZYeNvZs2dVt9utvvzyy6qqqurOnTtVAOrGjRvD+7zzzjuqJEnqsWPHVFVV1d/97ndqXl6e6vF4wvvcc8896pgxYzr4FaVGbW2tCkB99913VVUNnTOn06n+9a9/De+za9cuFYC6bt06VVVDb/6yLKvV1dXhfZ555hk1JycnfN5+8pOfqOPHj9c91/z589W5c+d29EtKmby8PPUPf/gDz2Eb1NfXq6NGjVJXr16tXn755eE3HZ7LrofvTdb4vpQ8fG9KHr43tU13eV/qsWVyXq8XmzZtwqxZs8LbZFnGrFmzsG7duhSOrOs6ePAgqqurdeesT58+mDFjRvicrVu3Drm5uZg2bVp4n1mzZkGWZaxfvz68z2WXXQaXyxXeZ+7cudizZw/OnDnTSa+m85w7dw4A0LdvXwDApk2b4PP5dOdx7NixGDJkiO48Tpw4EUVFReF95s6di7q6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IkqAoihYvXo1PvzwQ6xatQpPPfUU7r33Xqxfv950/4aGBkydOhV//vOfo+4rLCzs6OESEVEPx/clovZhMESUIEmScPHFF+Piiy/Gfffdh6FDh+K1116Dy+VCIBDQ7Xv++edj+fLl6NevH3JyciyP+emnn6K5uRnp6ekAgI8++ghZWVkYPHhwh74WIiLq/vi+RNR2LJMjSsD69evx8MMP4+OPP0ZVVRVeffVVnDhxAuPGjUNJSQm2bt2KPXv24OTJk/D5fLjllltQUFCA66+/Hu+//z4OHjyIyspKfP/738fRo0fDx/V6vfjOd76DnTt3YsWKFViyZAkWLVrEumwiIrLF9yWi9mFmiCgBOTk5eO+99/Dkk0+irq4OQ4cOxX/913/h6quvxrRp01BZWYlp06ahoaEBa9euxRVXXIH33nsP99xzD2666SbU19dj4MCBmDlzpu4TuZkzZ2LUqFG47LLL4PF4cPPNN+P+++9P3QslIqJuge9LRO0jqaqqpnoQRL3Zt771LZw9exavv/56qodCRETE9yXqVZjrJCIiIiKiXonBEBERERER9UoskyMiIiIiol6JmSEiIiIiIuqVGAwREREREVGvxGCIiIiIiIh6JQZDRERERETUKzEYIiIiIiKiXonBEBERERER9UoMhoiIiIiIqFdiMERERERERL0SgyEiIiIiIuqV/j+QDzkdSIqTHAAAAABJRU5ErkJggg==",
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"601.806633pt\" height=\"321.95625pt\" viewBox=\"0 0 601.806633 321.95625\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n",
       " <metadata>\n",
       "  <rdf:RDF xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n",
       "   <cc:Work>\n",
       "    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n",
       "    <dc:date>2023-04-27T23:27:29.289320</dc:date>\n",
       "    <dc:format>image/svg+xml</dc:format>\n",
       "    <dc:creator>\n",
       "     <cc:Agent>\n",
       "      <dc:title>Matplotlib v3.6.3, https://matplotlib.org/</dc:title>\n",
       "     </cc:Agent>\n",
       "    </dc:creator>\n",
       "   </cc:Work>\n",
       "  </rdf:RDF>\n",
       " </metadata>\n",
       " <defs>\n",
       "  <style type=\"text/css\">*{stroke-linejoin: round; stroke-linecap: butt}</style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M -0 321.95625 \n",
       "L 601.806633 321.95625 \n",
       "L 601.806633 0 \n",
       "L -0 0 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 30.103125 284.4 \n",
       "L 283.739489 284.4 \n",
       "L 283.739489 7.2 \n",
       "L 30.103125 7.2 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\">\n",
       "    <g id=\"xtick_1\">\n",
       "     <g id=\"line2d_1\">\n",
       "      <path d=\"M 41.632051 284.4 \n",
       "L 41.632051 7.2 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_2\">\n",
       "      <defs>\n",
       "       <path id=\"m66551a7b1a\" d=\"M 0 0 \n",
       "L 0 3.5 \n",
       "\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"41.632051\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_1\">\n",
       "      <!-- 0 -->\n",
       "      <g transform=\"translate(38.450801 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-30\" d=\"M 2034 4250 \n",
       "Q 1547 4250 1301 3770 \n",
       "Q 1056 3291 1056 2328 \n",
       "Q 1056 1369 1301 889 \n",
       "Q 1547 409 2034 409 \n",
       "Q 2525 409 2770 889 \n",
       "Q 3016 1369 3016 2328 \n",
       "Q 3016 3291 2770 3770 \n",
       "Q 2525 4250 2034 4250 \n",
       "z\n",
       "M 2034 4750 \n",
       "Q 2819 4750 3233 4129 \n",
       "Q 3647 3509 3647 2328 \n",
       "Q 3647 1150 3233 529 \n",
       "Q 2819 -91 2034 -91 \n",
       "Q 1250 -91 836 529 \n",
       "Q 422 1150 422 2328 \n",
       "Q 422 3509 836 4129 \n",
       "Q 1250 4750 2034 4750 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_2\">\n",
       "     <g id=\"line2d_3\">\n",
       "      <path d=\"M 100.603537 284.4 \n",
       "L 100.603537 7.2 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_4\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"100.603537\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_2\">\n",
       "      <!-- 1000 -->\n",
       "      <g transform=\"translate(87.878537 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-31\" d=\"M 794 531 \n",
       "L 1825 531 \n",
       "L 1825 4091 \n",
       "L 703 3866 \n",
       "L 703 4441 \n",
       "L 1819 4666 \n",
       "L 2450 4666 \n",
       "L 2450 531 \n",
       "L 3481 531 \n",
       "L 3481 0 \n",
       "L 794 0 \n",
       "L 794 531 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_3\">\n",
       "     <g id=\"line2d_5\">\n",
       "      <path d=\"M 159.575024 284.4 \n",
       "L 159.575024 7.2 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_6\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"159.575024\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_3\">\n",
       "      <!-- 2000 -->\n",
       "      <g transform=\"translate(146.850024 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-32\" d=\"M 1228 531 \n",
       "L 3431 531 \n",
       "L 3431 0 \n",
       "L 469 0 \n",
       "L 469 531 \n",
       "Q 828 903 1448 1529 \n",
       "Q 2069 2156 2228 2338 \n",
       "Q 2531 2678 2651 2914 \n",
       "Q 2772 3150 2772 3378 \n",
       "Q 2772 3750 2511 3984 \n",
       "Q 2250 4219 1831 4219 \n",
       "Q 1534 4219 1204 4116 \n",
       "Q 875 4013 500 3803 \n",
       "L 500 4441 \n",
       "Q 881 4594 1212 4672 \n",
       "Q 1544 4750 1819 4750 \n",
       "Q 2544 4750 2975 4387 \n",
       "Q 3406 4025 3406 3419 \n",
       "Q 3406 3131 3298 2873 \n",
       "Q 3191 2616 2906 2266 \n",
       "Q 2828 2175 2409 1742 \n",
       "Q 1991 1309 1228 531 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_4\">\n",
       "     <g id=\"line2d_7\">\n",
       "      <path d=\"M 218.54651 284.4 \n",
       "L 218.54651 7.2 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_8\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"218.54651\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_4\">\n",
       "      <!-- 3000 -->\n",
       "      <g transform=\"translate(205.82151 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-33\" d=\"M 2597 2516 \n",
       "Q 3050 2419 3304 2112 \n",
       "Q 3559 1806 3559 1356 \n",
       "Q 3559 666 3084 287 \n",
       "Q 2609 -91 1734 -91 \n",
       "Q 1441 -91 1130 -33 \n",
       "Q 819 25 488 141 \n",
       "L 488 750 \n",
       "Q 750 597 1062 519 \n",
       "Q 1375 441 1716 441 \n",
       "Q 2309 441 2620 675 \n",
       "Q 2931 909 2931 1356 \n",
       "Q 2931 1769 2642 2001 \n",
       "Q 2353 2234 1838 2234 \n",
       "L 1294 2234 \n",
       "L 1294 2753 \n",
       "L 1863 2753 \n",
       "Q 2328 2753 2575 2939 \n",
       "Q 2822 3125 2822 3475 \n",
       "Q 2822 3834 2567 4026 \n",
       "Q 2313 4219 1838 4219 \n",
       "Q 1578 4219 1281 4162 \n",
       "Q 984 4106 628 3988 \n",
       "L 628 4550 \n",
       "Q 988 4650 1302 4700 \n",
       "Q 1616 4750 1894 4750 \n",
       "Q 2613 4750 3031 4423 \n",
       "Q 3450 4097 3450 3541 \n",
       "Q 3450 3153 3228 2886 \n",
       "Q 3006 2619 2597 2516 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-33\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_5\">\n",
       "     <g id=\"line2d_9\">\n",
       "      <path d=\"M 277.517997 284.4 \n",
       "L 277.517997 7.2 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_10\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"277.517997\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_5\">\n",
       "      <!-- 4000 -->\n",
       "      <g transform=\"translate(264.792997 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-34\" d=\"M 2419 4116 \n",
       "L 825 1625 \n",
       "L 2419 1625 \n",
       "L 2419 4116 \n",
       "z\n",
       "M 2253 4666 \n",
       "L 3047 4666 \n",
       "L 3047 1625 \n",
       "L 3713 1625 \n",
       "L 3713 1100 \n",
       "L 3047 1100 \n",
       "L 3047 0 \n",
       "L 2419 0 \n",
       "L 2419 1100 \n",
       "L 313 1100 \n",
       "L 313 1709 \n",
       "L 2253 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-34\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"text_6\">\n",
       "     <!-- step -->\n",
       "     <g transform=\"translate(146.105682 312.676562) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-73\" d=\"M 2834 3397 \n",
       "L 2834 2853 \n",
       "Q 2591 2978 2328 3040 \n",
       "Q 2066 3103 1784 3103 \n",
       "Q 1356 3103 1142 2972 \n",
       "Q 928 2841 928 2578 \n",
       "Q 928 2378 1081 2264 \n",
       "Q 1234 2150 1697 2047 \n",
       "L 1894 2003 \n",
       "Q 2506 1872 2764 1633 \n",
       "Q 3022 1394 3022 966 \n",
       "Q 3022 478 2636 193 \n",
       "Q 2250 -91 1575 -91 \n",
       "Q 1294 -91 989 -36 \n",
       "Q 684 19 347 128 \n",
       "L 347 722 \n",
       "Q 666 556 975 473 \n",
       "Q 1284 391 1588 391 \n",
       "Q 1994 391 2212 530 \n",
       "Q 2431 669 2431 922 \n",
       "Q 2431 1156 2273 1281 \n",
       "Q 2116 1406 1581 1522 \n",
       "L 1381 1569 \n",
       "Q 847 1681 609 1914 \n",
       "Q 372 2147 372 2553 \n",
       "Q 372 3047 722 3315 \n",
       "Q 1072 3584 1716 3584 \n",
       "Q 2034 3584 2315 3537 \n",
       "Q 2597 3491 2834 3397 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-74\" d=\"M 1172 4494 \n",
       "L 1172 3500 \n",
       "L 2356 3500 \n",
       "L 2356 3053 \n",
       "L 1172 3053 \n",
       "L 1172 1153 \n",
       "Q 1172 725 1289 603 \n",
       "Q 1406 481 1766 481 \n",
       "L 2356 481 \n",
       "L 2356 0 \n",
       "L 1766 0 \n",
       "Q 1100 0 847 248 \n",
       "Q 594 497 594 1153 \n",
       "L 594 3053 \n",
       "L 172 3053 \n",
       "L 172 3500 \n",
       "L 594 3500 \n",
       "L 594 4494 \n",
       "L 1172 4494 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-65\" d=\"M 3597 1894 \n",
       "L 3597 1613 \n",
       "L 953 1613 \n",
       "Q 991 1019 1311 708 \n",
       "Q 1631 397 2203 397 \n",
       "Q 2534 397 2845 478 \n",
       "Q 3156 559 3463 722 \n",
       "L 3463 178 \n",
       "Q 3153 47 2828 -22 \n",
       "Q 2503 -91 2169 -91 \n",
       "Q 1331 -91 842 396 \n",
       "Q 353 884 353 1716 \n",
       "Q 353 2575 817 3079 \n",
       "Q 1281 3584 2069 3584 \n",
       "Q 2775 3584 3186 3129 \n",
       "Q 3597 2675 3597 1894 \n",
       "z\n",
       "M 3022 2063 \n",
       "Q 3016 2534 2758 2815 \n",
       "Q 2500 3097 2075 3097 \n",
       "Q 1594 3097 1305 2825 \n",
       "Q 1016 2553 972 2059 \n",
       "L 3022 2063 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-70\" d=\"M 1159 525 \n",
       "L 1159 -1331 \n",
       "L 581 -1331 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2969 \n",
       "Q 1341 3281 1617 3432 \n",
       "Q 1894 3584 2278 3584 \n",
       "Q 2916 3584 3314 3078 \n",
       "Q 3713 2572 3713 1747 \n",
       "Q 3713 922 3314 415 \n",
       "Q 2916 -91 2278 -91 \n",
       "Q 1894 -91 1617 61 \n",
       "Q 1341 213 1159 525 \n",
       "z\n",
       "M 3116 1747 \n",
       "Q 3116 2381 2855 2742 \n",
       "Q 2594 3103 2138 3103 \n",
       "Q 1681 3103 1420 2742 \n",
       "Q 1159 2381 1159 1747 \n",
       "Q 1159 1113 1420 752 \n",
       "Q 1681 391 2138 391 \n",
       "Q 2594 391 2855 752 \n",
       "Q 3116 1113 3116 1747 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-73\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-74\" x=\"52.099609\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-65\" x=\"91.308594\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-70\" x=\"152.832031\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_2\">\n",
       "    <g id=\"ytick_1\">\n",
       "     <g id=\"line2d_11\">\n",
       "      <path d=\"M 30.103125 259.107649 \n",
       "L 283.739489 259.107649 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_12\">\n",
       "      <defs>\n",
       "       <path id=\"m3ca6c97098\" d=\"M 0 0 \n",
       "L -3.5 0 \n",
       "\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"259.107649\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_7\">\n",
       "      <!-- 0.1 -->\n",
       "      <g transform=\"translate(7.2 262.906867) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-2e\" d=\"M 684 794 \n",
       "L 1344 794 \n",
       "L 1344 0 \n",
       "L 684 0 \n",
       "L 684 794 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-31\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_2\">\n",
       "     <g id=\"line2d_13\">\n",
       "      <path d=\"M 30.103125 219.052594 \n",
       "L 283.739489 219.052594 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_14\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"219.052594\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_8\">\n",
       "      <!-- 0.2 -->\n",
       "      <g transform=\"translate(7.2 222.851813) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-32\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_3\">\n",
       "     <g id=\"line2d_15\">\n",
       "      <path d=\"M 30.103125 178.99754 \n",
       "L 283.739489 178.99754 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_16\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"178.99754\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_9\">\n",
       "      <!-- 0.3 -->\n",
       "      <g transform=\"translate(7.2 182.796759) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-33\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_4\">\n",
       "     <g id=\"line2d_17\">\n",
       "      <path d=\"M 30.103125 138.942486 \n",
       "L 283.739489 138.942486 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_18\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"138.942486\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_10\">\n",
       "      <!-- 0.4 -->\n",
       "      <g transform=\"translate(7.2 142.741705) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-34\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_5\">\n",
       "     <g id=\"line2d_19\">\n",
       "      <path d=\"M 30.103125 98.887432 \n",
       "L 283.739489 98.887432 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_20\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"98.887432\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_11\">\n",
       "      <!-- 0.5 -->\n",
       "      <g transform=\"translate(7.2 102.686651) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-35\" d=\"M 691 4666 \n",
       "L 3169 4666 \n",
       "L 3169 4134 \n",
       "L 1269 4134 \n",
       "L 1269 2991 \n",
       "Q 1406 3038 1543 3061 \n",
       "Q 1681 3084 1819 3084 \n",
       "Q 2600 3084 3056 2656 \n",
       "Q 3513 2228 3513 1497 \n",
       "Q 3513 744 3044 326 \n",
       "Q 2575 -91 1722 -91 \n",
       "Q 1428 -91 1123 -41 \n",
       "Q 819 9 494 109 \n",
       "L 494 744 \n",
       "Q 775 591 1075 516 \n",
       "Q 1375 441 1709 441 \n",
       "Q 2250 441 2565 725 \n",
       "Q 2881 1009 2881 1497 \n",
       "Q 2881 1984 2565 2268 \n",
       "Q 2250 2553 1709 2553 \n",
       "Q 1456 2553 1204 2497 \n",
       "Q 953 2441 691 2322 \n",
       "L 691 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_6\">\n",
       "     <g id=\"line2d_21\">\n",
       "      <path d=\"M 30.103125 58.832378 \n",
       "L 283.739489 58.832378 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_22\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"58.832378\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_12\">\n",
       "      <!-- 0.6 -->\n",
       "      <g transform=\"translate(7.2 62.631597) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-36\" d=\"M 2113 2584 \n",
       "Q 1688 2584 1439 2293 \n",
       "Q 1191 2003 1191 1497 \n",
       "Q 1191 994 1439 701 \n",
       "Q 1688 409 2113 409 \n",
       "Q 2538 409 2786 701 \n",
       "Q 3034 994 3034 1497 \n",
       "Q 3034 2003 2786 2293 \n",
       "Q 2538 2584 2113 2584 \n",
       "z\n",
       "M 3366 4563 \n",
       "L 3366 3988 \n",
       "Q 3128 4100 2886 4159 \n",
       "Q 2644 4219 2406 4219 \n",
       "Q 1781 4219 1451 3797 \n",
       "Q 1122 3375 1075 2522 \n",
       "Q 1259 2794 1537 2939 \n",
       "Q 1816 3084 2150 3084 \n",
       "Q 2853 3084 3261 2657 \n",
       "Q 3669 2231 3669 1497 \n",
       "Q 3669 778 3244 343 \n",
       "Q 2819 -91 2113 -91 \n",
       "Q 1303 -91 875 529 \n",
       "Q 447 1150 447 2328 \n",
       "Q 447 3434 972 4092 \n",
       "Q 1497 4750 2381 4750 \n",
       "Q 2619 4750 2861 4703 \n",
       "Q 3103 4656 3366 4563 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-36\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_7\">\n",
       "     <g id=\"line2d_23\">\n",
       "      <path d=\"M 30.103125 18.777324 \n",
       "L 283.739489 18.777324 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_24\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"30.103125\" y=\"18.777324\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_13\">\n",
       "      <!-- 0.7 -->\n",
       "      <g transform=\"translate(7.2 22.576542) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-37\" d=\"M 525 4666 \n",
       "L 3525 4666 \n",
       "L 3525 4397 \n",
       "L 1831 0 \n",
       "L 1172 0 \n",
       "L 2766 4134 \n",
       "L 525 4134 \n",
       "L 525 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-37\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"line2d_25\">\n",
       "    <path d=\"M 41.632051 22.920157 \n",
       "L 42.221765 19.8 \n",
       "L 42.81148 21.552926 \n",
       "L 43.401195 21.618486 \n",
       "L 43.99091 25.744125 \n",
       "L 44.580625 25.223466 \n",
       "L 45.17034 21.468076 \n",
       "L 45.760055 24.742081 \n",
       "L 46.34977 25.685751 \n",
       "L 46.939484 20.703728 \n",
       "L 47.529199 45.744511 \n",
       "L 48.118914 33.117818 \n",
       "L 48.708629 45.134466 \n",
       "L 49.298344 42.015431 \n",
       "L 49.888059 45.162113 \n",
       "L 50.477774 28.202882 \n",
       "L 51.067488 38.588269 \n",
       "L 51.657203 40.966473 \n",
       "L 52.246918 43.897686 \n",
       "L 52.836633 30.834778 \n",
       "L 53.426348 40.897332 \n",
       "L 54.016063 39.634696 \n",
       "L 54.605778 54.846492 \n",
       "L 55.195493 56.050062 \n",
       "L 55.785207 55.80845 \n",
       "L 56.374922 42.584746 \n",
       "L 56.964637 43.450108 \n",
       "L 57.554352 31.064357 \n",
       "L 58.733782 44.275264 \n",
       "L 59.323497 40.618428 \n",
       "L 59.913211 48.89943 \n",
       "L 61.092641 85.062421 \n",
       "L 61.682356 71.239558 \n",
       "L 62.272071 83.111645 \n",
       "L 62.861786 69.827682 \n",
       "L 63.451501 71.21332 \n",
       "L 64.041216 71.699719 \n",
       "L 64.63093 75.652982 \n",
       "L 65.220645 89.188871 \n",
       "L 65.81036 66.192142 \n",
       "L 66.400075 100.825602 \n",
       "L 66.98979 81.139287 \n",
       "L 67.579505 81.840056 \n",
       "L 68.16922 67.428969 \n",
       "L 68.758934 93.349749 \n",
       "L 69.348649 107.660706 \n",
       "L 69.938364 97.900644 \n",
       "L 70.528079 99.303949 \n",
       "L 71.117794 108.014767 \n",
       "L 71.707509 97.729868 \n",
       "L 72.297224 113.372256 \n",
       "L 72.886938 123.716244 \n",
       "L 73.476653 88.047901 \n",
       "L 74.066368 122.879938 \n",
       "L 74.656083 75.47206 \n",
       "L 75.245798 86.489983 \n",
       "L 75.835513 115.469156 \n",
       "L 76.425228 123.585494 \n",
       "L 77.014943 106.398738 \n",
       "L 77.604657 83.178996 \n",
       "L 78.194372 79.707857 \n",
       "L 78.784087 95.399247 \n",
       "L 79.373802 97.959447 \n",
       "L 79.963517 77.014436 \n",
       "L 80.553232 118.840905 \n",
       "L 81.142947 129.634071 \n",
       "L 82.322376 96.969197 \n",
       "L 82.912091 96.277166 \n",
       "L 83.501806 117.533026 \n",
       "L 84.091521 129.485093 \n",
       "L 84.681236 139.046291 \n",
       "L 85.270951 105.846995 \n",
       "L 85.860666 140.550526 \n",
       "L 86.45038 155.575419 \n",
       "L 87.040095 130.617087 \n",
       "L 87.62981 135.326808 \n",
       "L 88.219525 121.125949 \n",
       "L 88.80924 127.673972 \n",
       "L 89.398955 116.896002 \n",
       "L 89.98867 160.389436 \n",
       "L 90.578384 143.013533 \n",
       "L 91.168099 152.495336 \n",
       "L 91.757814 100.920754 \n",
       "L 92.347529 127.388479 \n",
       "L 92.937244 102.122402 \n",
       "L 93.526959 132.051406 \n",
       "L 94.116674 107.201369 \n",
       "L 94.706389 154.713293 \n",
       "L 95.296103 151.057651 \n",
       "L 95.885818 119.825544 \n",
       "L 96.475533 176.179751 \n",
       "L 97.065248 121.398324 \n",
       "L 97.654963 119.449231 \n",
       "L 98.244678 131.054184 \n",
       "L 98.834393 124.300803 \n",
       "L 99.424107 171.852156 \n",
       "L 100.013822 174.198798 \n",
       "L 100.603537 141.945607 \n",
       "L 101.193252 134.805445 \n",
       "L 101.782967 161.623459 \n",
       "L 102.372682 158.360985 \n",
       "L 103.552111 154.56453 \n",
       "L 104.141826 132.452214 \n",
       "L 104.731541 140.883745 \n",
       "L 105.321256 178.278812 \n",
       "L 105.910971 150.078789 \n",
       "L 106.500686 154.346888 \n",
       "L 107.090401 139.61101 \n",
       "L 108.26983 164.418658 \n",
       "L 108.859545 181.377482 \n",
       "L 109.44926 161.968507 \n",
       "L 110.038975 135.807918 \n",
       "L 110.62869 137.271173 \n",
       "L 111.218405 159.450959 \n",
       "L 111.80812 157.86802 \n",
       "L 112.987549 190.930121 \n",
       "L 113.577264 173.784525 \n",
       "L 114.166979 152.375652 \n",
       "L 114.756694 193.697028 \n",
       "L 115.346409 160.992654 \n",
       "L 115.936124 166.561672 \n",
       "L 116.525839 184.820246 \n",
       "L 117.115553 185.00913 \n",
       "L 117.705268 201.174528 \n",
       "L 118.294983 122.9208 \n",
       "L 118.884698 143.608586 \n",
       "L 119.474413 189.638811 \n",
       "L 120.064128 207.091806 \n",
       "L 120.653843 162.144858 \n",
       "L 121.243557 142.061913 \n",
       "L 121.833272 158.90978 \n",
       "L 122.422987 165.252588 \n",
       "L 123.012702 161.41446 \n",
       "L 123.602417 162.879075 \n",
       "L 124.192132 165.519877 \n",
       "L 124.781847 209.669835 \n",
       "L 125.371562 215.999673 \n",
       "L 125.961276 199.472556 \n",
       "L 127.140706 158.057991 \n",
       "L 127.730421 160.948056 \n",
       "L 128.320136 160.817008 \n",
       "L 128.909851 190.596472 \n",
       "L 129.499566 189.964152 \n",
       "L 130.08928 166.5616 \n",
       "L 130.678995 200.377663 \n",
       "L 131.26871 159.554491 \n",
       "L 131.858425 95.462204 \n",
       "L 132.44814 181.221772 \n",
       "L 133.037855 177.800603 \n",
       "L 133.62757 176.085721 \n",
       "L 134.217284 185.036527 \n",
       "L 134.806999 185.121294 \n",
       "L 135.396714 205.936952 \n",
       "L 135.986429 179.640027 \n",
       "L 136.576144 215.850385 \n",
       "L 137.165859 187.179768 \n",
       "L 137.755574 212.670255 \n",
       "L 138.345289 123.74327 \n",
       "L 138.935003 177.571836 \n",
       "L 139.524718 198.045287 \n",
       "L 140.114433 199.282066 \n",
       "L 140.704148 173.403915 \n",
       "L 141.293863 199.006863 \n",
       "L 141.883578 161.533093 \n",
       "L 142.473293 141.387561 \n",
       "L 143.063007 191.477018 \n",
       "L 143.652722 184.126699 \n",
       "L 144.242437 149.676202 \n",
       "L 144.832152 183.015213 \n",
       "L 145.421867 146.478345 \n",
       "L 146.011582 147.390644 \n",
       "L 146.601297 162.215479 \n",
       "L 147.191012 206.875191 \n",
       "L 147.780726 177.260008 \n",
       "L 148.370441 136.90028 \n",
       "L 148.960156 204.830152 \n",
       "L 149.549871 204.384573 \n",
       "L 150.139586 204.137924 \n",
       "L 150.729301 184.570194 \n",
       "L 151.319016 216.556872 \n",
       "L 151.90873 227.684917 \n",
       "L 153.08816 149.57871 \n",
       "L 153.677875 204.927197 \n",
       "L 154.26759 192.915443 \n",
       "L 154.857305 184.511869 \n",
       "L 155.44702 222.095808 \n",
       "L 156.036735 206.135136 \n",
       "L 156.626449 199.239014 \n",
       "L 157.216164 187.625281 \n",
       "L 157.805879 209.353692 \n",
       "L 158.395594 198.589164 \n",
       "L 158.985309 183.566945 \n",
       "L 159.575024 175.926775 \n",
       "L 160.164739 192.310889 \n",
       "L 160.754453 216.012201 \n",
       "L 161.344168 230.975187 \n",
       "L 161.933883 222.87075 \n",
       "L 162.523598 204.194024 \n",
       "L 163.703028 184.152782 \n",
       "L 164.292743 210.92837 \n",
       "L 164.882458 185.330806 \n",
       "L 166.061887 222.767009 \n",
       "L 166.651602 214.839161 \n",
       "L 167.241317 200.113693 \n",
       "L 167.831032 190.643147 \n",
       "L 168.420747 228.858596 \n",
       "L 169.010462 179.794675 \n",
       "L 169.600176 247.595803 \n",
       "L 170.189891 227.05681 \n",
       "L 170.779606 192.481306 \n",
       "L 171.369321 190.860908 \n",
       "L 171.959036 225.776304 \n",
       "L 172.548751 189.540722 \n",
       "L 173.138466 214.472786 \n",
       "L 173.72818 208.127167 \n",
       "L 174.317895 203.332733 \n",
       "L 174.90761 227.019554 \n",
       "L 175.497325 230.267595 \n",
       "L 176.08704 185.781536 \n",
       "L 176.676755 185.781548 \n",
       "L 177.26647 232.482455 \n",
       "L 177.856185 207.00255 \n",
       "L 178.445899 197.440267 \n",
       "L 179.035614 220.488583 \n",
       "L 179.625329 206.907899 \n",
       "L 180.215044 180.251171 \n",
       "L 180.804759 216.50442 \n",
       "L 181.394474 232.140569 \n",
       "L 181.984189 209.112684 \n",
       "L 182.573903 208.562736 \n",
       "L 183.163618 198.412288 \n",
       "L 183.753333 233.423451 \n",
       "L 184.343048 203.548978 \n",
       "L 184.932763 180.772987 \n",
       "L 185.522478 206.456513 \n",
       "L 186.112193 216.644612 \n",
       "L 186.701908 193.015812 \n",
       "L 187.291622 191.914903 \n",
       "L 187.881337 216.990168 \n",
       "L 188.471052 224.961402 \n",
       "L 189.060767 202.576962 \n",
       "L 189.650482 173.788225 \n",
       "L 190.240197 195.280444 \n",
       "L 190.829912 239.275044 \n",
       "L 191.419626 230.481715 \n",
       "L 192.009341 232.222848 \n",
       "L 192.599056 222.68593 \n",
       "L 193.188771 229.24687 \n",
       "L 193.778486 196.281414 \n",
       "L 194.368201 212.415386 \n",
       "L 194.957916 211.740372 \n",
       "L 195.547631 230.600432 \n",
       "L 196.137345 228.533572 \n",
       "L 196.72706 183.29241 \n",
       "L 197.316775 213.001187 \n",
       "L 197.90649 193.363045 \n",
       "L 198.496205 234.568027 \n",
       "L 199.08592 235.951355 \n",
       "L 199.675635 192.646256 \n",
       "L 200.265349 200.379704 \n",
       "L 201.444779 265.509692 \n",
       "L 202.034494 244.689987 \n",
       "L 202.624209 216.382969 \n",
       "L 203.803639 240.647629 \n",
       "L 204.393353 207.873009 \n",
       "L 204.983068 215.243604 \n",
       "L 205.572783 181.920154 \n",
       "L 206.162498 229.725443 \n",
       "L 206.752213 228.222007 \n",
       "L 207.341928 239.944705 \n",
       "L 207.931643 239.599978 \n",
       "L 208.521358 238.69397 \n",
       "L 209.111072 248.923969 \n",
       "L 209.700787 231.756993 \n",
       "L 210.290502 168.304631 \n",
       "L 210.880217 241.732977 \n",
       "L 211.469932 217.152163 \n",
       "L 212.059647 198.334648 \n",
       "L 212.649362 223.99619 \n",
       "L 213.239076 177.658071 \n",
       "L 213.828791 229.091738 \n",
       "L 214.418506 270.257192 \n",
       "L 215.597936 207.059826 \n",
       "L 216.187651 218.754775 \n",
       "L 216.777366 239.481864 \n",
       "L 217.367081 202.068455 \n",
       "L 217.956795 220.885112 \n",
       "L 218.54651 248.655516 \n",
       "L 219.136225 251.75555 \n",
       "L 219.72594 207.737485 \n",
       "L 220.315655 199.83954 \n",
       "L 220.90537 232.821911 \n",
       "L 221.495085 234.077922 \n",
       "L 222.084799 231.219723 \n",
       "L 222.674514 233.792524 \n",
       "L 223.264229 219.099238 \n",
       "L 223.853944 217.986714 \n",
       "L 224.443659 230.596159 \n",
       "L 225.033374 235.533322 \n",
       "L 225.623089 182.812959 \n",
       "L 226.212804 243.35014 \n",
       "L 226.802518 247.716078 \n",
       "L 227.392233 226.61526 \n",
       "L 228.571663 254.124684 \n",
       "L 229.161378 206.129764 \n",
       "L 229.751093 241.184898 \n",
       "L 230.340808 226.242224 \n",
       "L 230.930522 256.315314 \n",
       "L 231.520237 201.133434 \n",
       "L 232.109952 246.654061 \n",
       "L 232.699667 242.300168 \n",
       "L 233.289382 258.426137 \n",
       "L 233.879097 214.303246 \n",
       "L 234.468812 213.756343 \n",
       "L 235.058526 254.811821 \n",
       "L 235.648241 236.820131 \n",
       "L 236.237956 206.844643 \n",
       "L 236.827671 242.301714 \n",
       "L 237.417386 194.248832 \n",
       "L 238.007101 239.206201 \n",
       "L 238.596816 234.126644 \n",
       "L 239.186531 254.2287 \n",
       "L 239.776245 201.12805 \n",
       "L 240.955675 271.8 \n",
       "L 241.54539 239.562746 \n",
       "L 242.135105 236.874028 \n",
       "L 242.72482 233.267436 \n",
       "L 243.314535 262.886827 \n",
       "L 243.904249 228.99917 \n",
       "L 244.493964 244.977754 \n",
       "L 245.083679 235.315334 \n",
       "L 245.673394 233.564162 \n",
       "L 246.263109 218.413982 \n",
       "L 246.852824 247.475367 \n",
       "L 247.442539 214.530927 \n",
       "L 248.032254 265.226843 \n",
       "L 248.621968 217.977917 \n",
       "L 249.211683 220.619667 \n",
       "L 249.801398 249.753465 \n",
       "L 250.391113 233.709118 \n",
       "L 250.980828 253.175457 \n",
       "L 251.570543 241.714558 \n",
       "L 252.160258 222.532792 \n",
       "L 252.749972 252.720946 \n",
       "L 253.339687 249.951129 \n",
       "L 253.929402 240.336948 \n",
       "L 254.519117 235.777136 \n",
       "L 255.108832 235.983705 \n",
       "L 255.698547 244.100682 \n",
       "L 256.288262 239.048569 \n",
       "L 256.877977 243.257942 \n",
       "L 257.467691 254.054935 \n",
       "L 258.057406 240.253643 \n",
       "L 258.647121 262.973763 \n",
       "L 259.236836 247.142142 \n",
       "L 259.826551 269.783342 \n",
       "L 260.416266 238.959534 \n",
       "L 261.005981 222.272391 \n",
       "L 261.595695 249.041086 \n",
       "L 262.18541 228.704407 \n",
       "L 262.775125 247.019194 \n",
       "L 263.36484 238.06988 \n",
       "L 263.954555 238.25929 \n",
       "L 264.54427 253.991031 \n",
       "L 265.723699 268.054491 \n",
       "L 266.313414 246.433172 \n",
       "L 266.903129 266.052038 \n",
       "L 267.492844 252.614391 \n",
       "L 268.082559 225.235184 \n",
       "L 268.672274 258.438754 \n",
       "L 269.261989 232.785275 \n",
       "L 269.851704 219.240499 \n",
       "L 270.441418 251.37676 \n",
       "L 271.031133 238.043379 \n",
       "L 271.620848 238.221228 \n",
       "L 272.210563 229.517728 \n",
       "L 272.210563 229.517728 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"line2d_26\">\n",
       "    <path d=\"M 41.632051 20.731585 \n",
       "L 53.190462 42.28663 \n",
       "L 64.748873 66.45458 \n",
       "L 76.307285 95.855622 \n",
       "L 87.865696 119.769135 \n",
       "L 99.424107 129.686257 \n",
       "L 110.982519 130.746366 \n",
       "L 122.54093 139.882108 \n",
       "L 134.099342 151.068597 \n",
       "L 145.657753 152.319699 \n",
       "L 157.216164 149.046348 \n",
       "L 168.774576 145.926538 \n",
       "L 180.332987 157.835175 \n",
       "L 191.891398 157.539118 \n",
       "L 203.44981 159.585702 \n",
       "L 215.008221 152.680328 \n",
       "L 226.566632 151.443234 \n",
       "L 238.125044 149.603953 \n",
       "L 249.683455 145.519394 \n",
       "L 261.241867 139.815333 \n",
       "\" clip-path=\"url(#p21668d47f5)\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 30.103125 284.4 \n",
       "L 30.103125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 283.739489 284.4 \n",
       "L 283.739489 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 30.103125 284.4 \n",
       "L 283.739489 284.4 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 30.103125 7.2 \n",
       "L 283.739489 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"legend_1\">\n",
       "    <g id=\"patch_7\">\n",
       "     <path d=\"M 197.148864 45.1125 \n",
       "L 276.739489 45.1125 \n",
       "Q 278.739489 45.1125 278.739489 43.1125 \n",
       "L 278.739489 14.2 \n",
       "Q 278.739489 12.2 276.739489 12.2 \n",
       "L 197.148864 12.2 \n",
       "Q 195.148864 12.2 195.148864 14.2 \n",
       "L 195.148864 43.1125 \n",
       "Q 195.148864 45.1125 197.148864 45.1125 \n",
       "z\n",
       "\" style=\"fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter\"/>\n",
       "    </g>\n",
       "    <g id=\"line2d_27\">\n",
       "     <path d=\"M 199.148864 20.298437 \n",
       "L 209.148864 20.298437 \n",
       "L 219.148864 20.298437 \n",
       "\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_14\">\n",
       "     <!-- train_loss -->\n",
       "     <g transform=\"translate(227.148864 23.798437) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-72\" d=\"M 2631 2963 \n",
       "Q 2534 3019 2420 3045 \n",
       "Q 2306 3072 2169 3072 \n",
       "Q 1681 3072 1420 2755 \n",
       "Q 1159 2438 1159 1844 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2956 \n",
       "Q 1341 3275 1631 3429 \n",
       "Q 1922 3584 2338 3584 \n",
       "Q 2397 3584 2469 3576 \n",
       "Q 2541 3569 2628 3553 \n",
       "L 2631 2963 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-61\" d=\"M 2194 1759 \n",
       "Q 1497 1759 1228 1600 \n",
       "Q 959 1441 959 1056 \n",
       "Q 959 750 1161 570 \n",
       "Q 1363 391 1709 391 \n",
       "Q 2188 391 2477 730 \n",
       "Q 2766 1069 2766 1631 \n",
       "L 2766 1759 \n",
       "L 2194 1759 \n",
       "z\n",
       "M 3341 1997 \n",
       "L 3341 0 \n",
       "L 2766 0 \n",
       "L 2766 531 \n",
       "Q 2569 213 2275 61 \n",
       "Q 1981 -91 1556 -91 \n",
       "Q 1019 -91 701 211 \n",
       "Q 384 513 384 1019 \n",
       "Q 384 1609 779 1909 \n",
       "Q 1175 2209 1959 2209 \n",
       "L 2766 2209 \n",
       "L 2766 2266 \n",
       "Q 2766 2663 2505 2880 \n",
       "Q 2244 3097 1772 3097 \n",
       "Q 1472 3097 1187 3025 \n",
       "Q 903 2953 641 2809 \n",
       "L 641 3341 \n",
       "Q 956 3463 1253 3523 \n",
       "Q 1550 3584 1831 3584 \n",
       "Q 2591 3584 2966 3190 \n",
       "Q 3341 2797 3341 1997 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-69\" d=\"M 603 3500 \n",
       "L 1178 3500 \n",
       "L 1178 0 \n",
       "L 603 0 \n",
       "L 603 3500 \n",
       "z\n",
       "M 603 4863 \n",
       "L 1178 4863 \n",
       "L 1178 4134 \n",
       "L 603 4134 \n",
       "L 603 4863 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6e\" d=\"M 3513 2113 \n",
       "L 3513 0 \n",
       "L 2938 0 \n",
       "L 2938 2094 \n",
       "Q 2938 2591 2744 2837 \n",
       "Q 2550 3084 2163 3084 \n",
       "Q 1697 3084 1428 2787 \n",
       "Q 1159 2491 1159 1978 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2956 \n",
       "Q 1366 3272 1645 3428 \n",
       "Q 1925 3584 2291 3584 \n",
       "Q 2894 3584 3203 3211 \n",
       "Q 3513 2838 3513 2113 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-5f\" d=\"M 3263 -1063 \n",
       "L 3263 -1509 \n",
       "L -63 -1509 \n",
       "L -63 -1063 \n",
       "L 3263 -1063 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6c\" d=\"M 603 4863 \n",
       "L 1178 4863 \n",
       "L 1178 0 \n",
       "L 603 0 \n",
       "L 603 4863 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6f\" d=\"M 1959 3097 \n",
       "Q 1497 3097 1228 2736 \n",
       "Q 959 2375 959 1747 \n",
       "Q 959 1119 1226 758 \n",
       "Q 1494 397 1959 397 \n",
       "Q 2419 397 2687 759 \n",
       "Q 2956 1122 2956 1747 \n",
       "Q 2956 2369 2687 2733 \n",
       "Q 2419 3097 1959 3097 \n",
       "z\n",
       "M 1959 3584 \n",
       "Q 2709 3584 3137 3096 \n",
       "Q 3566 2609 3566 1747 \n",
       "Q 3566 888 3137 398 \n",
       "Q 2709 -91 1959 -91 \n",
       "Q 1206 -91 779 398 \n",
       "Q 353 888 353 1747 \n",
       "Q 353 2609 779 3096 \n",
       "Q 1206 3584 1959 3584 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-72\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"80.322266\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-69\" x=\"141.601562\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6e\" x=\"169.384766\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"232.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"282.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6f\" x=\"310.546875\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"371.728516\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"423.828125\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"line2d_28\">\n",
       "     <path d=\"M 199.148864 35.254687 \n",
       "L 209.148864 35.254687 \n",
       "L 219.148864 35.254687 \n",
       "\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_15\">\n",
       "     <!-- val_loss -->\n",
       "     <g transform=\"translate(227.148864 38.754687) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-76\" d=\"M 191 3500 \n",
       "L 800 3500 \n",
       "L 1894 563 \n",
       "L 2988 3500 \n",
       "L 3597 3500 \n",
       "L 2284 0 \n",
       "L 1503 0 \n",
       "L 191 3500 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-76\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"59.179688\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"120.458984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"148.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"198.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6f\" x=\"226.025391\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"287.207031\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"339.306641\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_2\">\n",
       "   <g id=\"patch_8\">\n",
       "    <path d=\"M 334.466761 284.4 \n",
       "L 588.103125 284.4 \n",
       "L 588.103125 7.2 \n",
       "L 334.466761 7.2 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_3\">\n",
       "    <g id=\"xtick_6\">\n",
       "     <g id=\"line2d_29\">\n",
       "      <path d=\"M 345.995687 284.4 \n",
       "L 345.995687 7.2 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_30\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"345.995687\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_16\">\n",
       "      <!-- 0 -->\n",
       "      <g transform=\"translate(342.814437 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_7\">\n",
       "     <g id=\"line2d_31\">\n",
       "      <path d=\"M 404.967174 284.4 \n",
       "L 404.967174 7.2 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_32\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"404.967174\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_17\">\n",
       "      <!-- 1000 -->\n",
       "      <g transform=\"translate(392.242174 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_8\">\n",
       "     <g id=\"line2d_33\">\n",
       "      <path d=\"M 463.93866 284.4 \n",
       "L 463.93866 7.2 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_34\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"463.93866\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_18\">\n",
       "      <!-- 2000 -->\n",
       "      <g transform=\"translate(451.21366 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_9\">\n",
       "     <g id=\"line2d_35\">\n",
       "      <path d=\"M 522.910147 284.4 \n",
       "L 522.910147 7.2 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_36\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"522.910147\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_19\">\n",
       "      <!-- 3000 -->\n",
       "      <g transform=\"translate(510.185147 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-33\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_10\">\n",
       "     <g id=\"line2d_37\">\n",
       "      <path d=\"M 581.881633 284.4 \n",
       "L 581.881633 7.2 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_38\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m66551a7b1a\" x=\"581.881633\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_20\">\n",
       "      <!-- 4000 -->\n",
       "      <g transform=\"translate(569.156633 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-34\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"text_21\">\n",
       "     <!-- step -->\n",
       "     <g transform=\"translate(450.469318 312.676562) scale(0.1 -0.1)\">\n",
       "      <use xlink:href=\"#DejaVuSans-73\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-74\" x=\"52.099609\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-65\" x=\"91.308594\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-70\" x=\"152.832031\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_4\">\n",
       "    <g id=\"ytick_8\">\n",
       "     <g id=\"line2d_39\">\n",
       "      <path d=\"M 334.466761 249.886957 \n",
       "L 588.103125 249.886957 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_40\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"334.466761\" y=\"249.886957\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_22\">\n",
       "      <!-- 0.5 -->\n",
       "      <g transform=\"translate(311.563636 253.686175) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_9\">\n",
       "     <g id=\"line2d_41\">\n",
       "      <path d=\"M 334.466761 203.13913 \n",
       "L 588.103125 203.13913 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_42\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"334.466761\" y=\"203.13913\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_23\">\n",
       "      <!-- 0.6 -->\n",
       "      <g transform=\"translate(311.563636 206.938349) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-36\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_10\">\n",
       "     <g id=\"line2d_43\">\n",
       "      <path d=\"M 334.466761 156.391304 \n",
       "L 588.103125 156.391304 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_44\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"334.466761\" y=\"156.391304\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_24\">\n",
       "      <!-- 0.7 -->\n",
       "      <g transform=\"translate(311.563636 160.190523) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-37\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_11\">\n",
       "     <g id=\"line2d_45\">\n",
       "      <path d=\"M 334.466761 109.643478 \n",
       "L 588.103125 109.643478 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_46\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"334.466761\" y=\"109.643478\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_25\">\n",
       "      <!-- 0.8 -->\n",
       "      <g transform=\"translate(311.563636 113.442697) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-38\" d=\"M 2034 2216 \n",
       "Q 1584 2216 1326 1975 \n",
       "Q 1069 1734 1069 1313 \n",
       "Q 1069 891 1326 650 \n",
       "Q 1584 409 2034 409 \n",
       "Q 2484 409 2743 651 \n",
       "Q 3003 894 3003 1313 \n",
       "Q 3003 1734 2745 1975 \n",
       "Q 2488 2216 2034 2216 \n",
       "z\n",
       "M 1403 2484 \n",
       "Q 997 2584 770 2862 \n",
       "Q 544 3141 544 3541 \n",
       "Q 544 4100 942 4425 \n",
       "Q 1341 4750 2034 4750 \n",
       "Q 2731 4750 3128 4425 \n",
       "Q 3525 4100 3525 3541 \n",
       "Q 3525 3141 3298 2862 \n",
       "Q 3072 2584 2669 2484 \n",
       "Q 3125 2378 3379 2068 \n",
       "Q 3634 1759 3634 1313 \n",
       "Q 3634 634 3220 271 \n",
       "Q 2806 -91 2034 -91 \n",
       "Q 1263 -91 848 271 \n",
       "Q 434 634 434 1313 \n",
       "Q 434 1759 690 2068 \n",
       "Q 947 2378 1403 2484 \n",
       "z\n",
       "M 1172 3481 \n",
       "Q 1172 3119 1398 2916 \n",
       "Q 1625 2713 2034 2713 \n",
       "Q 2441 2713 2670 2916 \n",
       "Q 2900 3119 2900 3481 \n",
       "Q 2900 3844 2670 4047 \n",
       "Q 2441 4250 2034 4250 \n",
       "Q 1625 4250 1398 4047 \n",
       "Q 1172 3844 1172 3481 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-38\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_12\">\n",
       "     <g id=\"line2d_47\">\n",
       "      <path d=\"M 334.466761 62.895652 \n",
       "L 588.103125 62.895652 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_48\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"334.466761\" y=\"62.895652\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_26\">\n",
       "      <!-- 0.9 -->\n",
       "      <g transform=\"translate(311.563636 66.694871) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-39\" d=\"M 703 97 \n",
       "L 703 672 \n",
       "Q 941 559 1184 500 \n",
       "Q 1428 441 1663 441 \n",
       "Q 2288 441 2617 861 \n",
       "Q 2947 1281 2994 2138 \n",
       "Q 2813 1869 2534 1725 \n",
       "Q 2256 1581 1919 1581 \n",
       "Q 1219 1581 811 2004 \n",
       "Q 403 2428 403 3163 \n",
       "Q 403 3881 828 4315 \n",
       "Q 1253 4750 1959 4750 \n",
       "Q 2769 4750 3195 4129 \n",
       "Q 3622 3509 3622 2328 \n",
       "Q 3622 1225 3098 567 \n",
       "Q 2575 -91 1691 -91 \n",
       "Q 1453 -91 1209 -44 \n",
       "Q 966 3 703 97 \n",
       "z\n",
       "M 1959 2075 \n",
       "Q 2384 2075 2632 2365 \n",
       "Q 2881 2656 2881 3163 \n",
       "Q 2881 3666 2632 3958 \n",
       "Q 2384 4250 1959 4250 \n",
       "Q 1534 4250 1286 3958 \n",
       "Q 1038 3666 1038 3163 \n",
       "Q 1038 2656 1286 2365 \n",
       "Q 1534 2075 1959 2075 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-39\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_13\">\n",
       "     <g id=\"line2d_49\">\n",
       "      <path d=\"M 334.466761 16.147826 \n",
       "L 588.103125 16.147826 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_50\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m3ca6c97098\" x=\"334.466761\" y=\"16.147826\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_27\">\n",
       "      <!-- 1.0 -->\n",
       "      <g transform=\"translate(311.563636 19.947045) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"line2d_51\">\n",
       "    <path d=\"M 345.995687 227.973913 \n",
       "L 346.585402 271.8 \n",
       "L 347.175117 235.278261 \n",
       "L 347.764832 242.582609 \n",
       "L 348.354546 209.713043 \n",
       "L 348.944261 220.669565 \n",
       "L 350.123691 227.973913 \n",
       "L 350.713406 220.669565 \n",
       "L 351.303121 217.017391 \n",
       "L 351.892836 187.8 \n",
       "L 352.482551 198.756522 \n",
       "L 353.072265 176.843478 \n",
       "L 353.66198 195.104348 \n",
       "L 354.251695 169.53913 \n",
       "L 354.84141 202.408696 \n",
       "L 355.431125 191.452174 \n",
       "L 356.02084 176.843478 \n",
       "L 356.610555 184.147826 \n",
       "L 357.200269 198.756522 \n",
       "L 357.789984 176.843478 \n",
       "L 358.379699 191.452174 \n",
       "L 358.969414 176.843478 \n",
       "L 360.148844 154.930435 \n",
       "L 360.738559 176.843478 \n",
       "L 361.328273 169.53913 \n",
       "L 361.917988 195.104348 \n",
       "L 362.507703 187.8 \n",
       "L 363.097418 184.147826 \n",
       "L 363.687133 176.843478 \n",
       "L 364.276848 173.191304 \n",
       "L 364.866563 147.626087 \n",
       "L 365.456278 129.365217 \n",
       "L 366.635707 143.973913 \n",
       "L 367.225422 143.973913 \n",
       "L 367.815137 151.278261 \n",
       "L 368.404852 154.930435 \n",
       "L 368.994567 151.278261 \n",
       "L 369.584282 136.669565 \n",
       "L 370.173996 151.278261 \n",
       "L 370.763711 125.713043 \n",
       "L 371.353426 154.930435 \n",
       "L 372.532856 140.321739 \n",
       "L 373.122571 129.365217 \n",
       "L 373.712286 114.756522 \n",
       "L 374.302001 118.408696 \n",
       "L 374.891715 129.365217 \n",
       "L 375.48143 133.017391 \n",
       "L 376.66086 125.713043 \n",
       "L 377.250575 114.756522 \n",
       "L 377.84029 154.930435 \n",
       "L 378.430005 100.147826 \n",
       "L 379.019719 154.930435 \n",
       "L 379.609434 114.756522 \n",
       "L 380.199149 103.8 \n",
       "L 380.788864 96.495652 \n",
       "L 381.378579 100.147826 \n",
       "L 381.968294 129.365217 \n",
       "L 382.558009 143.973913 \n",
       "L 383.147724 103.8 \n",
       "L 383.737438 125.713043 \n",
       "L 384.327153 129.365217 \n",
       "L 384.916868 111.104348 \n",
       "L 385.506583 114.756522 \n",
       "L 386.096298 114.756522 \n",
       "L 386.686013 111.104348 \n",
       "L 387.275728 129.365217 \n",
       "L 387.865442 96.495652 \n",
       "L 388.455157 100.147826 \n",
       "L 389.044872 96.495652 \n",
       "L 389.634587 122.06087 \n",
       "L 390.224302 92.843478 \n",
       "L 390.814017 89.191304 \n",
       "L 391.403732 114.756522 \n",
       "L 391.993446 107.452174 \n",
       "L 392.583161 118.408696 \n",
       "L 393.172876 118.408696 \n",
       "L 393.762591 114.756522 \n",
       "L 394.352306 78.234783 \n",
       "L 394.942021 118.408696 \n",
       "L 395.531736 89.191304 \n",
       "L 396.121451 111.104348 \n",
       "L 396.711165 114.756522 \n",
       "L 397.30088 125.713043 \n",
       "L 397.890595 89.191304 \n",
       "L 398.48031 107.452174 \n",
       "L 399.070025 78.234783 \n",
       "L 399.65974 92.843478 \n",
       "L 400.249455 111.104348 \n",
       "L 400.839169 74.582609 \n",
       "L 401.428884 111.104348 \n",
       "L 402.018599 107.452174 \n",
       "L 402.608314 118.408696 \n",
       "L 403.198029 100.147826 \n",
       "L 403.787744 89.191304 \n",
       "L 404.377459 85.53913 \n",
       "L 404.967174 78.234783 \n",
       "L 405.556888 103.8 \n",
       "L 406.146603 78.234783 \n",
       "L 406.736318 92.843478 \n",
       "L 407.326033 92.843478 \n",
       "L 407.915748 103.8 \n",
       "L 408.505463 92.843478 \n",
       "L 409.095178 107.452174 \n",
       "L 409.684892 67.278261 \n",
       "L 410.274607 92.843478 \n",
       "L 410.864322 96.495652 \n",
       "L 411.454037 81.886957 \n",
       "L 412.043752 74.582609 \n",
       "L 412.633467 89.191304 \n",
       "L 413.223182 70.930435 \n",
       "L 413.812897 85.53913 \n",
       "L 414.402611 85.53913 \n",
       "L 414.992326 96.495652 \n",
       "L 415.582041 81.886957 \n",
       "L 416.171756 92.843478 \n",
       "L 416.761471 67.278261 \n",
       "L 417.351186 56.321739 \n",
       "L 417.940901 78.234783 \n",
       "L 418.530615 92.843478 \n",
       "L 419.12033 63.626087 \n",
       "L 419.710045 81.886957 \n",
       "L 420.29976 81.886957 \n",
       "L 420.889475 78.234783 \n",
       "L 421.47919 67.278261 \n",
       "L 422.068905 67.278261 \n",
       "L 422.658619 107.452174 \n",
       "L 423.248334 107.452174 \n",
       "L 423.838049 67.278261 \n",
       "L 424.427764 56.321739 \n",
       "L 425.017479 81.886957 \n",
       "L 425.607194 92.843478 \n",
       "L 426.196909 81.886957 \n",
       "L 426.786624 74.582609 \n",
       "L 427.966053 81.886957 \n",
       "L 428.555768 70.930435 \n",
       "L 429.145483 67.278261 \n",
       "L 429.735198 38.06087 \n",
       "L 430.324913 49.017391 \n",
       "L 430.914628 81.886957 \n",
       "L 431.504342 89.191304 \n",
       "L 432.094057 81.886957 \n",
       "L 432.683772 85.53913 \n",
       "L 433.273487 67.278261 \n",
       "L 433.863202 81.886957 \n",
       "L 434.452917 78.234783 \n",
       "L 435.042632 56.321739 \n",
       "L 435.632347 81.886957 \n",
       "L 436.222061 114.756522 \n",
       "L 436.811776 63.626087 \n",
       "L 437.991206 70.930435 \n",
       "L 439.170636 63.626087 \n",
       "L 439.760351 52.669565 \n",
       "L 440.350065 74.582609 \n",
       "L 440.93978 52.669565 \n",
       "L 441.529495 78.234783 \n",
       "L 442.11921 52.669565 \n",
       "L 442.708925 92.843478 \n",
       "L 443.29864 59.973913 \n",
       "L 443.888355 49.017391 \n",
       "L 444.47807 52.669565 \n",
       "L 445.067784 92.843478 \n",
       "L 445.657499 63.626087 \n",
       "L 446.247214 85.53913 \n",
       "L 446.836929 85.53913 \n",
       "L 447.426644 59.973913 \n",
       "L 448.016359 74.582609 \n",
       "L 448.606074 81.886957 \n",
       "L 449.195788 78.234783 \n",
       "L 450.375218 85.53913 \n",
       "L 450.964933 67.278261 \n",
       "L 451.554648 59.973913 \n",
       "L 452.144363 59.973913 \n",
       "L 452.734078 81.886957 \n",
       "L 453.323792 45.365217 \n",
       "L 453.913507 56.321739 \n",
       "L 454.503222 59.973913 \n",
       "L 455.092937 70.930435 \n",
       "L 455.682652 45.365217 \n",
       "L 456.272367 52.669565 \n",
       "L 456.862082 67.278261 \n",
       "L 457.451797 85.53913 \n",
       "L 458.631226 49.017391 \n",
       "L 459.220941 81.886957 \n",
       "L 459.810656 49.017391 \n",
       "L 460.990086 70.930435 \n",
       "L 461.579801 63.626087 \n",
       "L 462.169515 63.626087 \n",
       "L 462.75923 70.930435 \n",
       "L 463.348945 85.53913 \n",
       "L 463.93866 67.278261 \n",
       "L 464.528375 67.278261 \n",
       "L 465.11809 52.669565 \n",
       "L 465.707805 52.669565 \n",
       "L 466.29752 38.06087 \n",
       "L 466.887234 56.321739 \n",
       "L 467.476949 70.930435 \n",
       "L 468.066664 70.930435 \n",
       "L 468.656379 59.973913 \n",
       "L 469.246094 78.234783 \n",
       "L 469.835809 56.321739 \n",
       "L 470.425524 49.017391 \n",
       "L 471.015238 56.321739 \n",
       "L 471.604953 52.669565 \n",
       "L 472.194668 70.930435 \n",
       "L 472.784383 45.365217 \n",
       "L 473.374098 78.234783 \n",
       "L 473.963813 30.756522 \n",
       "L 474.553528 56.321739 \n",
       "L 475.143243 67.278261 \n",
       "L 475.732957 70.930435 \n",
       "L 476.322672 45.365217 \n",
       "L 476.912387 74.582609 \n",
       "L 477.502102 49.017391 \n",
       "L 478.091817 63.626087 \n",
       "L 478.681532 49.017391 \n",
       "L 479.860961 41.713043 \n",
       "L 480.450676 56.321739 \n",
       "L 481.040391 74.582609 \n",
       "L 481.630106 38.06087 \n",
       "L 482.219821 52.669565 \n",
       "L 482.809536 59.973913 \n",
       "L 483.399251 49.017391 \n",
       "L 483.988966 59.973913 \n",
       "L 484.57868 81.886957 \n",
       "L 485.168395 56.321739 \n",
       "L 485.75811 45.365217 \n",
       "L 486.347825 49.017391 \n",
       "L 486.93754 67.278261 \n",
       "L 487.527255 63.626087 \n",
       "L 488.11697 41.713043 \n",
       "L 488.706684 56.321739 \n",
       "L 489.296399 81.886957 \n",
       "L 489.886114 59.973913 \n",
       "L 490.475829 52.669565 \n",
       "L 491.065544 59.973913 \n",
       "L 491.655259 70.930435 \n",
       "L 492.244974 52.669565 \n",
       "L 492.834688 56.321739 \n",
       "L 493.424403 52.669565 \n",
       "L 494.014118 92.843478 \n",
       "L 494.603833 59.973913 \n",
       "L 495.193548 45.365217 \n",
       "L 495.783263 41.713043 \n",
       "L 496.372978 45.365217 \n",
       "L 496.962693 52.669565 \n",
       "L 497.552407 41.713043 \n",
       "L 498.142122 59.973913 \n",
       "L 498.731837 63.626087 \n",
       "L 499.321552 56.321739 \n",
       "L 499.911267 45.365217 \n",
       "L 500.500982 59.973913 \n",
       "L 501.090697 63.626087 \n",
       "L 502.270126 56.321739 \n",
       "L 502.859841 45.365217 \n",
       "L 503.449556 49.017391 \n",
       "L 504.039271 59.973913 \n",
       "L 504.628986 67.278261 \n",
       "L 505.808416 23.452174 \n",
       "L 506.39813 41.713043 \n",
       "L 506.987845 41.713043 \n",
       "L 507.57756 52.669565 \n",
       "L 508.167275 41.713043 \n",
       "L 508.75699 67.278261 \n",
       "L 509.346705 49.017391 \n",
       "L 509.93642 78.234783 \n",
       "L 510.526134 59.973913 \n",
       "L 511.115849 38.06087 \n",
       "L 511.705564 34.408696 \n",
       "L 512.884994 41.713043 \n",
       "L 513.474709 41.713043 \n",
       "L 514.064424 52.669565 \n",
       "L 514.654139 70.930435 \n",
       "L 515.243853 41.713043 \n",
       "L 515.833568 49.017391 \n",
       "L 516.423283 63.626087 \n",
       "L 517.012998 56.321739 \n",
       "L 517.602713 63.626087 \n",
       "L 518.192428 38.06087 \n",
       "L 518.782143 19.8 \n",
       "L 519.371857 34.408696 \n",
       "L 519.961572 56.321739 \n",
       "L 520.551287 49.017391 \n",
       "L 521.141002 38.06087 \n",
       "L 521.730717 67.278261 \n",
       "L 522.910147 30.756522 \n",
       "L 523.499861 34.408696 \n",
       "L 524.089576 59.973913 \n",
       "L 524.679291 49.017391 \n",
       "L 525.269006 45.365217 \n",
       "L 525.858721 59.973913 \n",
       "L 526.448436 56.321739 \n",
       "L 527.038151 41.713043 \n",
       "L 527.627866 59.973913 \n",
       "L 528.21758 52.669565 \n",
       "L 528.807295 41.713043 \n",
       "L 529.39701 45.365217 \n",
       "L 529.986725 63.626087 \n",
       "L 530.57644 34.408696 \n",
       "L 531.166155 38.06087 \n",
       "L 531.75587 52.669565 \n",
       "L 532.345584 34.408696 \n",
       "L 532.935299 41.713043 \n",
       "L 533.525014 59.973913 \n",
       "L 534.114729 41.713043 \n",
       "L 534.704444 59.973913 \n",
       "L 535.294159 34.408696 \n",
       "L 535.883874 63.626087 \n",
       "L 536.473589 30.756522 \n",
       "L 537.063303 38.06087 \n",
       "L 537.653018 38.06087 \n",
       "L 538.242733 52.669565 \n",
       "L 538.832448 63.626087 \n",
       "L 539.422163 34.408696 \n",
       "L 540.011878 41.713043 \n",
       "L 540.601593 59.973913 \n",
       "L 541.191307 34.408696 \n",
       "L 541.781022 56.321739 \n",
       "L 542.370737 41.713043 \n",
       "L 542.960452 38.06087 \n",
       "L 543.550167 38.06087 \n",
       "L 544.139882 49.017391 \n",
       "L 544.729597 45.365217 \n",
       "L 545.319312 30.756522 \n",
       "L 545.909026 30.756522 \n",
       "L 547.088456 45.365217 \n",
       "L 547.678171 30.756522 \n",
       "L 548.267886 49.017391 \n",
       "L 548.857601 30.756522 \n",
       "L 549.447316 38.06087 \n",
       "L 550.03703 52.669565 \n",
       "L 550.626745 52.669565 \n",
       "L 551.21646 34.408696 \n",
       "L 551.806175 49.017391 \n",
       "L 552.39589 34.408696 \n",
       "L 552.985605 45.365217 \n",
       "L 553.57532 59.973913 \n",
       "L 554.165034 34.408696 \n",
       "L 554.754749 38.06087 \n",
       "L 555.344464 45.365217 \n",
       "L 555.934179 56.321739 \n",
       "L 556.523894 63.626087 \n",
       "L 557.113609 41.713043 \n",
       "L 558.293039 34.408696 \n",
       "L 558.882753 41.713043 \n",
       "L 560.062183 41.713043 \n",
       "L 561.241613 49.017391 \n",
       "L 561.831328 30.756522 \n",
       "L 562.421043 45.365217 \n",
       "L 563.010757 30.756522 \n",
       "L 563.600472 30.756522 \n",
       "L 564.190187 23.452174 \n",
       "L 564.779902 38.06087 \n",
       "L 565.959332 38.06087 \n",
       "L 566.549047 30.756522 \n",
       "L 567.138762 30.756522 \n",
       "L 567.728476 38.06087 \n",
       "L 568.907906 30.756522 \n",
       "L 570.087336 30.756522 \n",
       "L 570.677051 41.713043 \n",
       "L 571.266766 23.452174 \n",
       "L 571.85648 38.06087 \n",
       "L 572.446195 41.713043 \n",
       "L 573.03591 30.756522 \n",
       "L 573.625625 34.408696 \n",
       "L 574.21534 59.973913 \n",
       "L 574.805055 41.713043 \n",
       "L 575.39477 41.713043 \n",
       "L 575.984485 34.408696 \n",
       "L 576.574199 49.017391 \n",
       "L 576.574199 49.017391 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"line2d_52\">\n",
       "    <path d=\"M 345.995687 249.569071 \n",
       "L 357.554098 188.441614 \n",
       "L 369.11251 154.801878 \n",
       "L 380.670921 130.324717 \n",
       "L 392.229332 110.054859 \n",
       "L 403.787744 104.688209 \n",
       "L 415.346155 99.452452 \n",
       "L 426.904567 97.077663 \n",
       "L 438.462978 91.449224 \n",
       "L 450.021389 90.701259 \n",
       "L 461.579801 85.31591 \n",
       "L 473.138212 85.689892 \n",
       "L 484.696623 82.828925 \n",
       "L 496.255035 80.697224 \n",
       "L 507.813446 79.780967 \n",
       "L 519.371857 84.044369 \n",
       "L 530.930269 79.612675 \n",
       "L 542.48868 79.406984 \n",
       "L 554.047092 80.977711 \n",
       "L 565.605503 83.240306 \n",
       "\" clip-path=\"url(#p7578b64d0b)\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_9\">\n",
       "    <path d=\"M 334.466761 284.4 \n",
       "L 334.466761 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_10\">\n",
       "    <path d=\"M 588.103125 284.4 \n",
       "L 588.103125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_11\">\n",
       "    <path d=\"M 334.466761 284.4 \n",
       "L 588.103125 284.4 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_12\">\n",
       "    <path d=\"M 334.466761 7.2 \n",
       "L 588.103125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"legend_2\">\n",
       "    <g id=\"patch_13\">\n",
       "     <path d=\"M 341.466761 45.1125 \n",
       "L 418.866761 45.1125 \n",
       "Q 420.866761 45.1125 420.866761 43.1125 \n",
       "L 420.866761 14.2 \n",
       "Q 420.866761 12.2 418.866761 12.2 \n",
       "L 341.466761 12.2 \n",
       "Q 339.466761 12.2 339.466761 14.2 \n",
       "L 339.466761 43.1125 \n",
       "Q 339.466761 45.1125 341.466761 45.1125 \n",
       "z\n",
       "\" style=\"fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter\"/>\n",
       "    </g>\n",
       "    <g id=\"line2d_53\">\n",
       "     <path d=\"M 343.466761 20.298437 \n",
       "L 353.466761 20.298437 \n",
       "L 363.466761 20.298437 \n",
       "\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_28\">\n",
       "     <!-- train_acc -->\n",
       "     <g transform=\"translate(371.466761 23.798437) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-63\" d=\"M 3122 3366 \n",
       "L 3122 2828 \n",
       "Q 2878 2963 2633 3030 \n",
       "Q 2388 3097 2138 3097 \n",
       "Q 1578 3097 1268 2742 \n",
       "Q 959 2388 959 1747 \n",
       "Q 959 1106 1268 751 \n",
       "Q 1578 397 2138 397 \n",
       "Q 2388 397 2633 464 \n",
       "Q 2878 531 3122 666 \n",
       "L 3122 134 \n",
       "Q 2881 22 2623 -34 \n",
       "Q 2366 -91 2075 -91 \n",
       "Q 1284 -91 818 406 \n",
       "Q 353 903 353 1747 \n",
       "Q 353 2603 823 3093 \n",
       "Q 1294 3584 2113 3584 \n",
       "Q 2378 3584 2631 3529 \n",
       "Q 2884 3475 3122 3366 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-72\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"80.322266\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-69\" x=\"141.601562\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6e\" x=\"169.384766\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"232.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"282.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"344.042969\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"399.023438\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"line2d_54\">\n",
       "     <path d=\"M 343.466761 35.254687 \n",
       "L 353.466761 35.254687 \n",
       "L 363.466761 35.254687 \n",
       "\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_29\">\n",
       "     <!-- val_acc -->\n",
       "     <g transform=\"translate(371.466761 38.754687) scale(0.1 -0.1)\">\n",
       "      <use xlink:href=\"#DejaVuSans-76\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"59.179688\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"120.458984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"148.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"198.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"259.521484\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"314.501953\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"p21668d47f5\">\n",
       "   <rect x=\"30.103125\" y=\"7.2\" width=\"253.636364\" height=\"277.2\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"p7578b64d0b\">\n",
       "   <rect x=\"334.466761\" y=\"7.2\" width=\"253.636364\" height=\"277.2\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):    \n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        # axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n",
    "        # axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record, sample_step=10)  #横坐标是 steps"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3734\n",
      "accuracy: 0.8647\n"
     ]
    }
   ],
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/imdb-lstm-subword/best.ckpt\", map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, test_dl, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
